오늘은 저번에 이어 면접 질문들을 복습했다. 그 중에서 스프링 관련 질문들을 정리해본다.
JPA는 자바에서 관계형 DB를 사용할 때 객체 관계 매핑을 위한 API를 하는 ORM입니다. 객체지향 프로그래밍과 관계형 DB는 서로 패러다임 자체가 다르기 때문에 이를 자동으로 매핑시켜주는 역할을 합니다. JPA를 사용하면 SQL 쿼리를 직접 작성하지 않고도 객체를 DB에 저장, 조회할 수 있고 객체간 관계를 편하게 관리할 수 있습니다. 개발자는 이를 통해 객체지향적인 방식으로 데이터를 다룰 수 있게 됩니다.
JPA가 인터페이스와 규약을 정의한 API라면, Hibernate는 JPA를 구현하는 구체적인 라이브러리입니다. 개발자는 Hibernate를 통해 객체지향 프로그래밍과 관계형 DB간의 매핑, DB 테이블 생성 및 수정, DB 연산 등을 할 수 있습니다.
Dispatcher Servlet은 Spring Framework에서 웹 애플리케이션의 요청을 받아서 적절한 핸들러에게 전달하는 중앙 집중식 컨트롤러입니다. 클라이언트의 요청이 들어오면 Dispatcher Servlet이 해당 요청을 받아들이고, 이를 처리할 컨트롤러를 찾아서 전달하고, 그 후 처리된 결과를 다시 클라이언트에 반환합니다.
DI는 객체가 직접 의존하는 객체를 생성하지 않고, 외부에서 그 객체를 주입받는 디자인 패턴을 말합니다. 이를 통해 객체간 결합도를 낮추고 유연성과 재사용성을 높일 수 있습니다. 그리고 유닛 테스트를 하기 편해집니다. Spring에서는 DI를 구현한 IoC 컨테이너를 제공해 객체의 생명주기와 의존관계를 관리하고 의존성을 주입합니다. 이를 통해 개발자는 객체의 생성과 관리를 신경쓰지 않고 비즈니스 로직만 집중할 수 있게됩니다.
먼저 가장 권장되는 방식인 생성자 주입 방식이 있습니다. 객체가 생성될 때 생성자가 단 한번만 호출되어 객체 생성과 의존성 주입이 동시에 발생합니다. 이로인해 NPE를 사전에 막을 수 있는 장점이 있습니다. 그리고 유닛 테스트를 쉽게할 수 있고, final을 사용해 불변성을 확보할 수 있어 권장되는 방식입니다.
두번째로는 세터 주입 방식이 있습니다. Setter에 @Autowired를 붙여 의존성을 주입하는 방식으로 추후 객체의 변경이 가능한 특징이 있습니다.
세번째로는 필드 주입 방식이 있습니다. 필드에 직접 @Autowired을 붙여 간단하게 의존성을 주입할 수 있습니다. 객체의 생성 이후에 의존성이 주입되고, private 필드에 @Autowired를 붙이므로 외부에서 접근이 불가능해 유닛 테스트가 어려운 단점이 있습니다.