Gradle, Maven, Ant 와 같은 것은 무엇이며 이들의 필요성을 설명해 보아라.
Java에서 사용되는 빌드 툴이다.
컴파일, 테스트, 패키징 후 JAR or WAR 산출, 의존성 관리, 배포 및 배포 전 최적화
위의 과정을 자동으로 해주는 빌드 프로세스 도구이다.
Intellij 에서 프로젝트를 위한 JDK 버전과 Gradle 을 위한 JDK 버전, 이렇게 두 개로 나눠 존재하는 이유?
전자는 프로젝트 실행 환경, 컴파일 때 사용할 자바 버전이고,
후자는 빌드를 실행할 때 사용할 자바 버전이다. 실행 환경과 빌드 환경이 다를 수 있기에 나눠서 존재한다.
Lombok 은 무엇이며, 어떻게 동작되는것인가?
반복적으로 사용되는 메서드들을 어노테이션을 사용해서 따로 정의하지 않고도 사용하게 해주는 라이브러리이다.
컴파일 시점에 annotation processor를 사용해서 소스코드의 AST(추상 구문 트리)를 조작한다.
이때, 원하는 메서드의 추가 코드를 AST에 주입한 후, 이 수정된 AST를 통해 바이트 코드를 생성한다.
꼬리 질문 : Enabled Annotation Processing 옵션은 무엇을 의미하는가?
과거에는 lombok annotation processing을 통해 작동했기 때문에, 컴파일 시점에 이를 처리할 수 있도록 IDE가 인식하게 해야했음.
지금은 인텔리제이와 같은 IDE는 기본적으로 annotation processing을 활성화하기 때문에 의미가 없다.
WAS 의 동작 원리를 MVC 기준으로 설명해보아라
Controller : 어떤 요청이 들어왔을 때 이에 대한 비즈니스 로직을 시작 시키고, 이를 반환한다.
Model : DB에서 요청에 대해 응답할 데이터를 조회한 것이 model이라 한다.
View : model 기반으로 보여줄 응답을 생성한다.
HandlerMapping 은 무엇인가?
어떤 REST API의 요청을 받았을 때 어떤 메서드로 처리할 지를 정의한다.
꼬리 질문 1. RequestMappingHandlerMapping과 WelcomePageHandlerMapping의 차이를 설명하라.
꼬리 질문 2. RequestMappingHandlerMapping, WelcomePageHandlerMapping 는 어떤 순서로 순회되나
전자는 @RequestMapping 통해 정의된 메소드가 있는지를 확인한 후, 해당 메서드에서 반환하기로 명시한 페이지를 반환한다. 즉, 직접 페이지를 반환한다.
후자는 요청에 대한 디렉토리 내 페이지를 기반으로 반환한다.
요청이 들어오면 RequestMappingHandlerMapping으로 해당 요청에 매핑된 웹 페이지가 있는지를 확인하고
없다면 WelcomePageHandlerMapping 로 정의된 페이지가 있는지를 확인한다.
만약 정의된 디렉토리 내 페이지가 있으면 이를 통해 반환한다.
우리가 직접 서버에서 발생하는 에러 처리를 위한 커스텀 Controller 를 만들기 위해 어떻게 해야하는가
ErrorController(비어있음.)를 구현하면 된다.
꼬리 질문. Spring 이 제공하는 기본 에러 처리 Controller 구현체는 무엇인가?
BasicErroController이다. ErrorController가 구현되어있지 않다면, 자동적으로 error.html이나 404.html등 해당하는 반환값을 찾아서 제공한다.
Spring Controller 에서 String 을 반환하면 무엇이 반환되는지 설명하여라 (구체적일수록 좋다)
String값에 해당하는 ViewTemplate을 반환한다.
가령 "error" 라고만 return 했을 때,
thymeleaf는 요구하는 사항이 동적인지, 정적인지를 확인하고
demo.main 디렉토리 내의
동적이면 /resources/templates를, 정적이면 /resources/ static 디렉토리를 확인한다.
이 때, Thymeleaf가 자체적으로 prefix 인 "classpath:/templates or static"와
접미사 suffix인 ".html"을 자동적으로 붙여준다. (EnabledAutoConfiguration으로 설정된 값들이다.)
Spring Controller 에서 ModelAndView 는 무엇이며, 어떤 역할을 하는가?
동적 페이지를 반환하기 위해 사용한다.
service등의 비즈니스 로직을 통해 DB로 부터 얻어온 model과 반환할 ViewTemplate를 선택해
동적 페이지를 만들어 내는 객체이다.
@RequestMapping 는 어떻게 동작되는가 Spring MVC 아키텍쳐 관점에서 설명하라
REST API 요청이 들어왔을 때, 해당하는 요청에 controller내의 메서드를 mapping하기 위해 사용하는 어노테이션이다. value로는 URI, method는 RequestMethod가 들어오며
해당하는 메서드에서 반환할 model을 가져올 비즈니스 로직과 반환할 view를 선택하고
이를 어떻게 반환할지를 명시한다.
Tomcat이 무엇인지 설명하라
Tomcat은 Spring boot가 제공하는 내장 servlet container로,
Java Servelt과 JSP 기술을 실행할 수 있는 서버 환경을 제공한다.
이를 통해 자바 기반 WAS를 구축할 수 있다.
Spring boot에서는
application.yml 또는 application.properties를 설정하는 것 만으로 간편하게 tomcat의 설정을 바꿀 수 있다.
Tomcat 과 Spring 구조를 간략하게 설명하라
Application은 순수 바닐라 자바 혹은 Spring Application을 통해 만들어지고,
이는 비즈니스 로직을 처리하는 역할을 담당한다.
여기에 Tomcat이라는 servlet container를 이용해 이 어플리케이션에 서버의 기능을 더해준다.
이를 통해 WAS, 즉 웹 어플리케이션 서버의 성질을 갖는다.
여기에 JVM을 통해서 어플리케이션, 혹은 WAS가 구동이 된다.
이때, 어플리케이션만 빌드한 것은 WAR파일이 되지만
톰캣과 함께 빌드한 파일은 JAR가 된다.
이 WAR로 외부의 Tomcat(JVM을 기반으로 작동)에 배포되어야만 WAS를 실행할 수 있고,
JAR일 경우에는 그냥 JVM위에 실행시키기만 하면 was를 실행할 수 있다.
Tomcat 과 Spring 구조를 WAS 서버가 유저의 요청을 받고 반환까지를 기반으로 상세하게 설명하라
1. Request (Connection -> ServletRequest로 변환 -> Servlet에 전달)
- tomcat의 Connection Queue
모든 요청은 Connection Queue에 적재한다.
이 요청한 소켓을 연결하고, 요청을 ServletRequest 객체로 변환 후 Servlet에 전달한다.
- tomcat의 ThreadPoolExecutor 객체
이 스레드풀 관리 객체를 통해 Thread Pool에서 스레드를 할당 받은 뒤 Catalina에 전달한다.
- Catalina
tomcat의 엔진, Servlet Container이다.
1개의 요청당 할당받은 1개의 스레드를 연결한 후 Servlet에 할당한다.
-> Request 과정을 통해 Servlet에서는 ServletRequest들과 각각에 매핑되어 할당된 스레드가 있다.
2. Process
Catalina는 SevletRequest 를 HttpServletRequest로 변환하고 Servlet에 할당한다.
Servlet객체는 싱글톤으로, 한 종류의 Servlet당 한 개의 객체만 사용한다. (과거에는 여러개의 Servlet)
그런데 Spring은 Tomcat에서 유일한 Servlet(DispatcherServlet)만을 사용한다.
각 스레드 별로 단 하나의 싱글톤 객체만 바라보게 되지만, 수행은 각자 스레드만의 Method Stack에서 수행한다.
이 덕분에 Stateless & Thread-Safe 한 장점을 갖는다!
HandlerMapping : DispatcherServlet은 적합한 Controller Bean을 찾고
HandlerAdapter : DispatcherServlet이 찾은 Controller Bean에게 요청을 넘겨(위임:delegate) 처리한다.
3. Response
DispatcherSevlet이 처리 결과를 반환한다.
Spring MVC 아키텍쳐를 설명하라
요청이 들어오면 DispatcherServlet이 HandlerMapping을 통해 적절한 Controller를 선택하고
HandlerAdapter를 통해 Spring에 처리를 위임한 뒤
선택된 Controller에서 Service와 Repository에서 실행된 비즈니스 로직을 통해 얻은 데이터를 Model에 받는다.
Controller는 받아온 model과 return할 view name을 결정한다.
ViewResolver는 View name을 통해 ViewTemplate을 선택하고 model과 결합해 최종 View를 생성한다.
이때 나오는 View를 DispatcherServlet이 반환하는것이 Spring MVC 아키텍쳐이다.
DispatcherServlet 은 무엇이며 어떤 역할을 하는지 설명하라
DispatcherServlet은 Spring에서 사용하는 유일한 Servlet이다.
Spring이 요청에 대한 응답을 반환하기 위해서 사용하는 것이
싱글톤 Servlet인 DispatcherServlet이다.
요청에 대한 응답을 직접 처리하는 것이 아닌, Spring 스레드풀에서 할당 스레드를
HandlerMapping과 HandlerAdapter를 통해서 Controller에 위임하여 응답을 처리하고,
위임한 요청에 대한 응답만을 받아와 반환하는 형식인 Front Controller 패턴을 사용한다.
HandlerMapping 과 HandlerAdapter 에 대해 설명하라
HandlerMapping은 요청에 해당하는 처리 메서드가 존재하는지를 검색하고,
이 메서드가 있는 컨트롤러 Bean을 찾아 요청을 매핑한다.
HandlerAdapter는 매핑된 컨트롤러에 해당 요청에 대한 처리를 하도록 위임한다.
Spring Bean 은 어떤 개념인지 설명하고, 등록하는 방법들을 아는대로 설명하라
Spring Container가 관리하는 객체를 의미한다.
Spring에서 생성, 의존성 주입, 라이프사이클을 관리하고, Spring IoC Container가 이를 생성, 주입, 객체간 의존성을 관리한다.
등록 방법 1)
@Component, @Service, @Repository, @Controller를 클래스에 붙여 해당 클래스를 Bean으로 등록
등록 방법 2)
@Configuration(특정클래스의 위에 설정클래스로 지정하기 위해 이 어노테이션 등록)
+ @Bean(위 등록한 클래스의 new Class로 반환하는 메서드에 @Bean 어노테이션을 붙인다.)
등록 방법 3)
@ComponentScan + @Component 를 통한 등록
Spring Bean 은 어떻게 관리되는지 상세히 설명하라
Spring Bean은 Spring IoC Container에서 관리되며, 이것이 생성, 의존성 주입, 라이프 사이클을 관리한다.
기본적으로 Bean의 스코프는 Singleton 스코프로, 하나의 인스턴스만 생성되도록 관리한다.
Spring Container가 시작될 때 Bean이 생성되고, 애플리케이션 종료시 소멸된다.
꼬리 질문 : Servlet WebApplicationContext와 Root WebApplicationContext에 대해 설명하라
Servlet WebApplicationContext, Root WebApplicationContext 모두
Spring Container에서 사용되는 주요 ApplicationContext이다.
Root WebApplicationContext는 Spring 전역에서 비즈니스 관련 애플리케이션의 Bean을 관리한다.
주로 Service, Repository 레이어의 Bean을 등록한다.
그리고 모든 Servlet과 관련해서 참조할 공통 리소스 Bean을 정의한다.
Servlet WebApplicationContext는 Servlet과 관련한 컨텍스트(웹 관련 Bean)를 다루는데,
서블릿과 관련한 HandlerMapping, ViewResolver, Controller 등 DispatcherServlet을 통한 요청 처리에 관련한 Bean을 관리하며, 이때의 Bean은 Root에서 상속받는다.
ViewResolver 는 무엇이고, HttpMessageConverter 는 무엇이며 각각 어떤 작업을 하는가?
ViewResolver는 Controller부터 Model과 ViewName을 받아
ViewTemplate를 선택하고 이를 조합해 View를 완성해 DispatcherServlet에 반환한다.
HttpMessageConverter는 응답하기 위한 Model을 JSON 형태로 변환하거나
요청받은 JSON을 객체(DTO)로 변환하는 직렬화와 역직렬화 모두에서 사용.
'질문과 답변 > Java, Spring' 카테고리의 다른 글
Java, JVM (1) | 2024.11.13 |
---|---|
Spring, Spring Boot (4) (1) | 2024.11.06 |
Spring, Spring Boot (3) (0) | 2024.11.02 |
Spring, Spring Boot (2) (0) | 2024.10.31 |