Java 프레임워크 주니어 기술면접

Java 주니어 (1~3년) 프레임워크 5문항 조회수 51 · 2026-07-04 (토) 19:10:42
1 Spring Core
Medium

Q. Spring Framework에서 @Primary와 @Qualifier의 차이점을 설명하고, 같은 타입의 빈이 여러 개 있을 때 각각을 어떻게 활용할 수 있는지 설명해주세요.

A. 모범답안

@Primary는 같은 타입의 빈이 여러 개 있을 때 기본으로 주입될 빈을 지정하는 어노테이션이고, @Qualifier는 주입받을 때 특정 빈의 이름을 명시적으로 지정하는 어노테이션입니다. @Primary는 빈 정의 시점에 사용하며 전역적으로 우선순위를 부여하고, @Qualifier는 주입 시점에 사용하며 더 구체적인 선택이 가능합니다. @Qualifier가 @Primary보다 우선순위가 높아서, 둘 다 사용된 경우 @Qualifier로 지정된 빈이 주입됩니다. 일반적으로 기본 구현체는 @Primary로 지정하고, 특수한 경우에만 @Qualifier를 사용하는 것이 좋습니다.

핵심 포인트
  • • @Primary는 빈 정의 시점에 기본 빈을 지정, @Qualifier는 주입 시점에 특정 빈을 선택
  • • @Qualifier가 @Primary보다 우선순위가 높음
  • • @Primary는 전역 기본값 설정, @Qualifier는 구체적인 선택에 사용
Follow-up 질문

만약 @Primary도 없고 @Qualifier도 사용하지 않았을 때 같은 타입의 빈이 여러 개 있다면 어떤 예외가 발생하나요?

2 JPA
Medium

Q. JPA에서 CascadeType의 종류와 각각의 동작을 설명하고, CascadeType.ALL을 사용할 때 주의해야 할 점을 말씀해주세요.

A. 모범답안

CascadeType은 PERSIST(저장 전파), MERGE(병합 전파), REMOVE(삭제 전파), REFRESH(새로고침 전파), DETACH(준영속 전파), ALL(모든 작업 전파)로 구성됩니다. PERSIST는 부모 엔티티를 저장할 때 자식도 함께 저장하고, REMOVE는 부모 삭제 시 자식도 함께 삭제합니다. CascadeType.ALL을 사용하면 모든 영속성 전이가 적용되므로, 특히 REMOVE가 포함되어 부모 삭제 시 자식이 모두 삭제되는 점을 주의해야 합니다. 의도하지 않은 데이터 삭제를 방지하기 위해 필요한 CascadeType만 명시적으로 지정하는 것이 안전합니다.

핵심 포인트
  • • PERSIST, MERGE, REMOVE, REFRESH, DETACH, ALL 6가지 타입 존재
  • • CascadeType.ALL은 모든 영속성 전이를 포함하여 REMOVE도 적용됨
  • • 의도하지 않은 삭제 방지를 위해 필요한 타입만 선택적으로 사용 권장
Follow-up 질문

orphanRemoval 옵션과 CascadeType.REMOVE의 차이점은 무엇인가요?

3 Spring MVC
Easy

Q. Spring MVC에서 @ModelAttribute와 @RequestBody의 차이점을 설명하고, 각각 어떤 형식의 데이터를 받을 때 사용하는지 말씀해주세요.

A. 모범답안

@ModelAttribute는 쿼리 파라미터나 폼 데이터(application/x-www-form-urlencoded)를 객체로 바인딩할 때 사용하고, @RequestBody는 HTTP 요청 본문의 JSON이나 XML 같은 데이터를 객체로 변환할 때 사용합니다. @ModelAttribute는 각 필드를 개별 파라미터로 받아 세터를 통해 바인딩하며, @RequestBody는 HttpMessageConverter를 사용해 본문 전체를 객체로 역직렬화합니다. HTML 폼 전송에는 @ModelAttribute를, REST API의 JSON 요청에는 @RequestBody를 사용하는 것이 일반적입니다.

핵심 포인트
  • • @ModelAttribute는 쿼리 파라미터/폼 데이터 바인딩, @RequestBody는 HTTP 본문의 JSON/XML 변환
  • • @ModelAttribute는 세터 기반, @RequestBody는 HttpMessageConverter 기반
  • • 폼 전송은 @ModelAttribute, REST API JSON은 @RequestBody 사용
Follow-up 질문

@ModelAttribute를 사용할 때 기본 생성자가 없으면 어떻게 되나요?

4 Spring Boot
Medium

Q. Spring Boot의 외부 설정 우선순위에 대해 설명하고, application.properties, 환경변수, 커맨드라인 인자 중 어떤 것이 가장 높은 우선순위를 가지는지 말씀해주세요.

A. 모범답안

Spring Boot는 다양한 외부 설정 소스를 지원하며, 우선순위가 높은 순서대로 커맨드라인 인자, Java 시스템 프로퍼티, OS 환경변수, application.properties/yml 파일 순입니다. 커맨드라인 인자가 가장 높은 우선순위를 가지므로, 같은 속성이 여러 곳에 정의되어 있으면 커맨드라인 인자의 값이 최종적으로 적용됩니다. 이러한 우선순위 체계를 통해 배포 환경에서 설정 파일을 수정하지 않고도 런타임에 설정을 오버라이드할 수 있습니다. Profile별 설정 파일은 기본 설정 파일보다 높은 우선순위를 가집니다.

핵심 포인트
  • • 우선순위: 커맨드라인 인자 > 시스템 프로퍼티 > 환경변수 > application.properties
  • • 높은 우선순위의 설정이 낮은 우선순위의 설정을 오버라이드
  • • Profile별 설정 파일이 기본 설정 파일보다 우선순위 높음
Follow-up 질문

@Value 어노테이션과 @ConfigurationProperties의 차이점은 무엇인가요?

5 JPA
Medium

Q. JPA에서 EntityManager의 flush()와 commit()의 차이점을 설명하고, flush()가 자동으로 호출되는 시점을 말씀해주세요.

A. 모범답안

flush()는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 작업이고, commit()은 트랜잭션을 종료하고 변경사항을 영구적으로 저장하는 작업입니다. flush()는 SQL을 데이터베이스에 전송하지만 트랜잭션은 유지되며, commit()은 내부적으로 flush()를 호출한 후 트랜잭션을 커밋합니다. flush()는 트랜잭션 커밋 시점, JPQL 쿼리 실행 직전, EntityManager.flush() 직접 호출 시 자동으로 실행됩니다. JPQL 실행 전 flush()가 호출되는 이유는 영속성 컨텍스트의 변경 내용이 쿼리 결과에 반영되도록 하기 위함입니다.

핵심 포인트
  • • flush()는 DB 동기화, commit()은 트랜잭션 종료 및 영구 저장
  • • commit()은 내부적으로 flush()를 먼저 호출함
  • • 자동 flush 시점: 트랜잭션 커밋, JPQL 실행 직전, 명시적 호출
Follow-up 질문

FlushModeType.AUTO와 FlushModeType.COMMIT의 차이는 무엇인가요?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!