본문 바로가기

공부기록/Spring

스프링 면접 준비

다른 블로그 질문 참조.. 여기서 적을 수 있다고, 면접에서 대답할 수 있을까? 그건 잘 모르겠지만..

 

OOP가 뭐죠

객체지향 프로그래밍입니다.

상속, 다형성, 캡슐화, 인터페이스를 지원합니다.

상속 - 부모 클래스의 기능을 자식 클래스가 사용할 수 있습니다. 코드 중복제거라는 장점이 있긴하지만, 컴포지션으로 대체됩니다. 사실상 장점이 다형성밖에 없는 것 같긴 합니다.

다형성 - 코드상에서는 인터페이스를 의존하여, 실제 런타임에 구현 클래스를 사용하게 합니다. 추상에 의존하게 하여 OCP를 가능하게 해줍니다.

캡슐화 - 인터페이스와 구현을 분리할 수 있습니다. 퍼블릭 인터페이스만 테스트하면 되고, 나머지 구현은 적절히 바꿔도 괜찮습니다.

인터페이스 - 즉 추상화라는 말인데, 추상에 의존하게 하면 코드의 변경없이 기능을 쉽게 변경할 수 있게 해줍니다. 그래서 유연성을 늘려주고, 유지보수를 쉽게 해줍니다.

자바의 메모리 영역에 대해서 설명해보세요.

자바의 코드는 컴파일러가 컴파일하여 class파일이 생성됩니다. 거기서 JVM의 클래스 로더가 클래스파일에서 클래스 정보를 코드 영역? 이 존재하고

힙 영역 - 동적할당된 정보들을 저장하는 곳이고

PC register - 스레드의 주소라든지, 스레드 정보를 저장하는 것이고

stack - 해당 스레드의 메소드 실행에 관하여, 함수의 매개변수,

native - 스레드가 사용할 C/c++ 함수들이 저장되었습니다.

메서드 영역, 힙 여역- 프로세스의 스레드들이 공통으로 사용하고

나머지는 스레드별로 따로 사용합니다.

인터페이스가 뭐죠? 왜 사용하나요?

인터페이스에는 퍼블릭 메서드들만 보여줍니다. 그래서 인터페이스와 구현을 분리해서 객체의 역할을 매길 수도 있고, → 객체를 사용하는 방법을 쉽게 알 수 있는, 퍼블릭 인터페이스는 최대한 바꾸면 안되겠죠

메모리 상수풀 영역에 대해 설명해보세요.

변경되지 않는 스태틱 값들을 메모리 상수풀 영역에 저장하고, 메모리의 낭비를 막을 수 있는

힙 영역에서 생성되고 자바 프로세스 종료까지 가지고 있는

jdbc가 무엇인가요?

RDB의 사용법에 대한 자바 인터페이스 입니다. RDB 대부분 사용법이 비슷하므로, 어떤 RDB를 사용할지는 상관없이 같은 인터페이스를 제공해 줍니다.

직렬화가 무엇인가요?

통신에서 객체를 주고 받고 싶은데. 객체를 주고 받을수는 없으니, 직렬화해서 스트림으로 바꾼후 전송해줍니다. 객체뿐만 아니라, 그림이나 이미지파일, 영상같은 것도 직렬화하여 전송합니다. 받는곳에서는 디시리얼라이즈 해서 전달받습니다.

serialVersionUID를 선언해야 하는 이유가 뭔가요?

무조건 필요한 이유는, 어떤 객체를 직렬화하고 역직렬화할떄,

직렬화하는 객체가 수정될 수 있습니다.

버전 아이디를 부여해서, 같은 버전인 경우에만 디시리얼라이즈 할수 있게 합니다.

리플렉션이란 무엇인가요?

자바 코드에 접근해서 멤버변수나 함수들의 값을 얻어올 수 있습니다. 하지만, 리플렉션을 할때는 컴파일타임에 타입체크가 되지 않으므로 주의해야할 것입니다.

(답지) → 컴파일러를 무시한 채 런타임 상황에서 메모리에 올라간 클래스나 메서드 등의 정의를 동적으로 찾아 조작할 수 있는 행위를 말합니다.

자바의 클래스 멤버 변수 초기화 순서에 대해 설명하세요

—- >( 수퍼클래스부터 초기화하고, 그다음에 자신의 멤버변수를 초기화합니다.)

static 변수 선언부는 클래스가 로드 될때 제일 먼저 초기화됩니다. 필드 변수 선언부는 객체가 생성될때 heap 메모리에 올라가고 생성자 block보다 앞서 초기화됩니다. 생성자 block은 객체가 생성 될 때 마찬가지로 heap 메모리에 올라가는데, 이때 필드 변수가 초기화 될 때까지 JVM에서 내부적으로 로킹해준다.

Servlet과 JSP를 비교해서 설명하세요

Servlet은 컨트롤러인데, 결과값으로 view를 리턴해줄 수 있습니다.

JSP는html 코드에서 자바 코드를 삽입할 수 있게 한 것으로, 서블릿을 쉽게 접근할 수 있또록 만들어진것?

결국 요청을 둘다 처리해서 html을 돌려주는 것일텐데

servlet은 컨트롤러에 가깝고,

JSP는 뷰 상에서 요청을 처리하여 , 값들을 유동적으로 리턴할 수 있습니다.( 모델을 바인딩하여 보여줄수있다?)

제너릭이 무엇인가요

제너릭은 주로 컬렉션에서 사용되며, 타입체크의 목적으로 사용합니다. 예를 들어, 스트링의 리스트면 그 리스트에는 스트링만 들어갈 수 있습니다.

컬렉션 클래스에서 제너릭을 사용하는 이유를 설명하세요

타입체킹!! 의 목적으로 사용합니다.

(추가 T extends , List<T extends String> 같은 것은 어떻게 작용하는지??)

POJO가 무엇인가요

템플릿 메서드 패턴같은 것을 너무 많이 사용하게 하면, 사실 그게 나쁘다는게 아니라,

자유도가 없기떄문에

순수한 오래된 자바 오브젝트로 돌아가자!!

예시를 들자면, 서블릿과 스프링 컨트롤러 의 차이로 들수있을 것 같습니다.

서블릿은 템플릿 메서드로, 자유도는 없는

스프링 컨트롤러는 컨트롤러 클래스에 각각의 메서드를 핸들러로 사용하면 되기 때문에 엄청난 자유도가 있습니다.

박싱과 언박싱에 대해 설명하세요

primtive 타입을 래퍼클래스로 감싸는 의미입니다.

컬렉션에 넣을 수 있게 하기위해 사용합니다.

원시타입을 래퍼클래스로 변환하는 것을 박싱,

래퍼클래스에서 값을 꺼내오는 것을 언박싱이라고 합니다.

자바 jdk 1.5부터는 오토박싱을 지원합니다.

데드락이 무엇이고, 해결방법에 대해 설명해보세요

데드락은 프로세스들이 교착상태에 걸려 아무것도 못하는 상황에 걸린 것입니다.

예를 들면, 면접관 두분께 하나의 종이와 펜이 있는데, 면접관

데드락이 걸리는 4가지 조건이 있습니다.

첫번째는 자원은 하나의 프로세스만 가질 수 있다.

프로세스가 자원을 가진 상태에서 다른 프로세스가 자원을 빼앗을 수 없다.

프로세스가 자원을 구할때 자원을 요청하고 대기하는 방식

순환하여 대기가 발생할 수 있따.

해결방법은

  1. 4가지 조건을 차단하거나 자원을 뺏을수있따던지, 하나의 자원을 여러프로세스가 가질수 있다던지
  2. 데드락 상태인 ,

상속과 컴포지션의 차이에 대해서 설명해보세요

상속은 부모 클래스의 코드를 이어받는 것입니다. 퍼블릭 인터페이스면 퍼블릭 인터페이스를 구현한 것입니다.

컴포지션은 부모 클래스의 모든 것을 이어받는 방법이지만, 멤버 변수로 가져와서 사용하는 방법입니다.

상속은 extends를 사용하기 때문에, 제약, 컴포지션은 전략패턴으로 유연합니다.

JVM이 하는 역할이 무엇인가요?

jvm은 자바코드로 만든 클래스 파일을 실행할 수 있게 해줍니다.

jvm은 자바 클래스 파일을 실행할 수 있게 하는 인터페이스 입니다.

자바 메모리 구조를 가지며, 클래스로더를 가지고, 실행시켜주는 것을 가집니다.

운영체제 맞게 클래스파일을 실행할 수 있게 해줍니다.

Interface랑 abstract를 비교해서 설명해주세요

인터페이스는 퍼블릭 인터페이스로 API를 담당합니다.

abstract는 abstract method만을 제외하고 구현되어있는 클래스입니다.

하위 클래스에서는 앱트랙트 함수만 구현해야합니다.

전략패턴과, 템플릿 메서드이라고 할 수있겠습니다.

다형성에 대해 설명해보세요

컴파일 타임에는 인터페이스에 의존하고, 런타임에 실제 구체클래스를 사용하게 하는 방법입니다.

인터페이스에 의존하게 하고, 인터페이스를 상속한 여러 구체 클래스들이 그것을 사용할 수 있게 한 것입니다.

OCP 기존 코드를 고치지 않고 확장에는 열려있는 그런 것의 핵심입니다.

스프링의 MVC에 대해 설명하세요

스프링 MVC는

WAS에서 작동하는 dispatcherServlet입니다. 스프링에 개발자가 정의해놓은 컨트롤럴를 . 요청이 오면 실행시켜줍니다. 여러가지 지원해주는 다양한 기능이 있고,

view를 리턴해줄수도 있고, view를 프론트에서 담당하면, RestControler 사용할 수 있습니다.

POJO 사용할 수 있게 해줍니다.

스프링에서 AOP가 뭔가요?

개발자의 반복을 줄여주기 위한 방법입니다.

애노테이션을 사용하여 프록시 객체를 만드어서 ,

실제 함수의 실행 전후로 추가적인 작업을 해줄수 있습니다.

아니면 애노테이션 붙은 애들을 컴포넌트로 컨테이너 등록한단지

로그, 트랜잭션, 자원해제 ,서은ㅇ테스트 처럼 중복코드를 도와줄 수 있게 해준다.

스프링 DI에 대해 아는대로 말씀해주세요

컨테이너에서 의존성 주입을 해주는데,

생성자 주입이 있고,

필드 주입이 있습니다.

생성자 주입이 권장됩니다. 필드 주입은 런타임에 순환참조가 발생할 수 있기 떄문입니다.

스프링 필터랑 인터셉터의 차이점이 무엇일까요?

필터는 WAS에서 다루는 기술이고, 서블릿이 실행되기 전후로 실행됩니다.

인터셉터는 스프링에서 지원하는 기술로, 디스패쳐 서블릿과 컨트롤러 사이에서 실행됩니다.

컨트롤러 실행전후로 실행된다고 할 수 있을 것 같습니다.

IOC가 무엇인가요?

프레임워크, 컨테이너에서 의존성 주입을 해주는 다는 것인데.

code상에서 의존성을 같지 않을 수 있다는 것입니다.

Code상에 인터페이스에 의존하게 하고,

실제 실행에 프레임워크가 선택된 인터페이스의 구체클래스를 주입해줍니다.

(정답)→ 컴포넌트의 생성부터 소멸까지 개발자가 아닌 컨테이너가 관리해주는 것.

스프링이랑 스프링 부트의 차이점이 무엇일까요?

스프링은 DI 컨테이너, 컴포넌트의 생명주기를 관리해주는 프레임워크이고,

근데 스프링이 되게 유연하게 작성되어 있어서, 이것저것을 자기 마음대로 설정할 수 있는데.

아무래도 스프링으로 프로그램을 개발하려면 설정을 이것저것 입력해줘야하는데,

스프링 부트가 컨벤션으로 설정을 해줘서 스프링 프로그램을 빠르게 실행할 수 있게 해줍니다.

스프링 웹, MVC같은 경우, 톰캣을 기본 WAS로 설정해주는 것이 예입니다.

스프링 MVC 구조 흐름에 대해서 과정대로 설명해보세요

요청→ WAS 대기큐로 → 스레드를 하나실행 → HttpServlet 리퀘스트와 리스폰스 객체를 만듭니다. , 리퀘스트 객체에 받은 요청 메시지의 정보를 넣어줍니다. →필터→ 서블릿을 실행해야하는데 디스패쳐서블릿 밖에 없기 떄문에 → url 정보를 사용하여 어떤 컨트롤러를 사용할지 선택 →해당 컨트롤러를 실행할 핸들러어댑터를 선택합니다 → 인터셉터 → 핸들러 어댑터가 핸들러를 실행하는ㄷ[ㅔ → 컨틀로럴가 바로 실행되는 것은 아니고, 전처리작업들,

DAO와 DTO를 설명해주세요

DAO는 DB를 접근해주는 클래스이고

DTO는 레이어간의 의사소통을 위한 도구입니다. DTO에는 validation작업을 할 수 있게 합니다.

https://kim6394.tistory.com/161

(컴포넌트 생명주기??) →

컴포넌트 객체를 생성 → 의존관게wndlq

스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸전 콜백 → 스프링 종료

초기화는 무거운 작업이 있을 수 있어서 → 객체를 생성하는 부분과 초기화하는 부분을 나눈다? 유지보수

'공부기록 > Spring' 카테고리의 다른 글

layered architecture  (0) 2021.12.29
Spring Native  (0) 2021.11.24
토비의 스프링 13장 - 스프링 웹 기술과 스프링 MVC  (0) 2021.11.07
토비 스프링 5장 - 서비스 추상화  (0) 2021.10.27
토비의 스프링 4장 - 예외  (0) 2021.10.18