Java Spring Framework 주니어 기술면접
새 면접Q. Spring Framework에서 @Component, @Service, @Repository, @Controller 어노테이션의 차이점과 각각의 사용 목적을 설명해주세요.
@Component는 Spring이 관리하는 일반적인 빈을 나타내는 기본 어노테이션입니다. @Service는 비즈니스 로직을 담당하는 서비스 계층에 사용하며, @Repository는 데이터 접근 계층에 사용하고 영속성 예외를 Spring의 DataAccessException으로 변환합니다. @Controller는 MVC 패턴의 컨트롤러 역할을 하며 웹 요청을 처리합니다. 이들은 모두 @Component를 메타 어노테이션으로 가지고 있어 컴포넌트 스캔 대상이 되지만, 계층별 역할을 명확히 구분하여 코드의 가독성과 유지보수성을 높입니다.
- • @Component는 범용 스테레오타입, 나머지는 특정 계층을 위한 특화된 어노테이션
- • @Repository는 영속성 예외를 Spring 예외로 자동 변환
- • 계층별 역할 구분으로 코드의 의도를 명확히 표현
@RestController와 @Controller의 차이점은 무엇이며, 언제 각각을 사용해야 할까요?
Q. JPA에서 즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading)의 차이점을 설명하고, N+1 문제가 무엇인지, 이를 해결하는 방법을 설명해주세요.
즉시 로딩은 엔티티 조회 시 연관된 엔티티를 함께 조회하고, 지연 로딩은 실제 사용 시점에 조회합니다. N+1 문제는 1개의 쿼리로 N개의 엔티티를 조회했을 때, 각 엔티티의 연관 데이터를 조회하기 위해 추가로 N개의 쿼리가 발생하는 성능 문제입니다. 해결 방법으로는 Fetch Join을 사용하여 한 번의 쿼리로 연관 데이터를 함께 조회하거나, @EntityGraph를 사용하거나, Batch Size를 설정하여 쿼리 수를 줄일 수 있습니다. 일반적으로 @ManyToOne, @OneToOne은 기본이 즉시 로딩이지만, 성능을 위해 지연 로딩으로 변경하는 것이 권장됩니다.
- • 즉시 로딩은 조회 시점, 지연 로딩은 사용 시점에 연관 데이터 로드
- • N+1 문제는 연관 엔티티 조회 시 발생하는 추가 쿼리 문제
- • Fetch Join, @EntityGraph, Batch Size 설정으로 해결 가능
Fetch Join과 일반 Join의 차이점은 무엇이며, Fetch Join 사용 시 주의해야 할 점은 무엇인가요?
Q. application.properties와 application.yml의 차이점을 설명하고, Profile을 사용하여 개발, 테스트, 운영 환경을 분리하는 방법을 설명해주세요.
application.properties는 key=value 형식의 플랫 구조이고, application.yml은 YAML 형식으로 계층 구조를 표현하기 쉽고 가독성이 좋습니다. Profile을 사용하면 환경별로 다른 설정을 관리할 수 있으며, application-dev.yml, application-prod.yml처럼 파일을 분리하거나 하나의 yml 파일에서 ---로 구분하여 작성할 수 있습니다. 실행 시 spring.profiles.active 속성으로 활성화할 프로파일을 지정하며, @Profile 어노테이션으로 특정 환경에서만 동작하는 빈을 정의할 수도 있습니다.
- • yml은 계층 구조 표현이 용이하고 가독성이 좋음
- • Profile로 환경별 설정 분리 가능
- • spring.profiles.active로 활성 프로파일 지정
여러 개의 Profile을 동시에 활성화할 수 있나요? 그리고 Profile 우선순위는 어떻게 결정되나요?
Q. Spring Data JPA에서 쿼리 메서드(Query Method)의 네이밍 규칙을 설명하고, @Query 어노테이션을 사용하는 경우와 쿼리 메서드를 사용하는 경우를 비교하여 설명해주세요.
쿼리 메서드는 메서드 이름으로 쿼리를 자동 생성하는 기능으로, findBy, countBy, deleteBy 등의 키워드와 엔티티 필드명을 조합하여 작성합니다. 예를 들어 findByNameAndAge는 name과 age로 조회하는 쿼리를 생성합니다. 간단한 조건의 CRUD는 쿼리 메서드가 직관적이고 타입 안전하지만, 복잡한 조인이나 동적 쿼리가 필요한 경우 메서드명이 너무 길어지므로 @Query를 사용합니다. @Query는 JPQL이나 Native SQL을 직접 작성할 수 있어 복잡한 쿼리에 유리하며, 성능 최적화가 필요한 경우에도 활용됩니다.
- • 쿼리 메서드는 메서드명으로 쿼리 자동 생성
- • 간단한 조건은 쿼리 메서드, 복잡한 쿼리는 @Query 사용
- • @Query는 JPQL과 Native SQL 모두 지원
동적 쿼리가 필요한 경우 Querydsl이나 Specification을 사용하는 이유와 각각의 장단점을 설명해주세요.
Q. @RequestParam, @PathVariable, @RequestBody의 차이점을 설명하고, 각각 어떤 상황에서 사용해야 하는지 예시와 함께 설명해주세요.
@RequestParam은 쿼리 파라미터나 폼 데이터를 받을 때 사용하며, URL에서 ?key=value 형태의 데이터를 추출합니다. @PathVariable은 URL 경로의 일부를 변수로 받을 때 사용하며, RESTful API에서 리소스 식별자를 받을 때 주로 활용됩니다. @RequestBody는 HTTP 요청 본문의 JSON이나 XML을 Java 객체로 변환할 때 사용하며, POST나 PUT 요청에서 복잡한 데이터 구조를 전달받을 때 사용됩니다. 예를 들어 검색 필터는 @RequestParam, 사용자 ID 조회는 @PathVariable, 회원가입 정보는 @RequestBody로 받는 것이 적합합니다.
- • @RequestParam은 쿼리 파라미터, @PathVariable은 URL 경로 변수
- • @RequestBody는 요청 본문의 JSON/XML을 객체로 변환
- • 리소스 식별은 PathVariable, 복잡한 데이터는 RequestBody 사용
@ModelAttribute는 언제 사용하며, @RequestBody와의 차이점은 무엇인가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!