Spring 주니어 시스템 설계 면접

Spring 주니어 (1~3년) 시스템 설계 5문항 조회수 91 · 2026-06-24 (수) 03:10:56
1 API 설계
Medium

Q. 게시판 서비스에서 게시글 목록 조회 API를 설계할 때, 페이징(Pagination) 처리를 어떻게 구현하시겠습니까? 페이지 번호 기반 방식과 커서 기반 방식의 차이점, 그리고 Spring Data JPA의 Pageable을 활용한 구현 방법을 설명해주세요.

A. 모범답안

페이지 번호 기반 방식은 page와 size 파라미터로 특정 페이지를 조회하며, Spring Data JPA의 Pageable 인터페이스를 사용해 구현합니다. 커서 기반 방식은 마지막 조회 항목의 ID를 기준으로 다음 데이터를 가져오는 방식으로 실시간 데이터 변경에 강합니다. 페이지 기반은 구현이 간단하고 특정 페이지 이동이 가능하지만, 데이터 변경 시 중복/누락이 발생할 수 있습니다. 커서 기반은 일관성은 높지만 특정 페이지로 직접 이동이 불가능합니다. Spring에서는 PageRequest.of(page, size, sort)로 Pageable 객체를 생성하고, Repository 메서드에서 Page<T>를 반환받아 사용합니다.

핵심 포인트
  • • 페이지 번호 기반: page, size 파라미터 사용, 특정 페이지 이동 가능
  • • 커서 기반: 마지막 항목 ID 기준, 실시간 데이터 변경에 안정적
  • • Spring Data JPA의 Pageable 인터페이스와 PageRequest 활용
  • • Page<T> 반환 타입으로 totalElements, totalPages 등 메타데이터 제공
Follow-up 질문

무한 스크롤 UI를 구현할 때는 페이지 기반과 커서 기반 중 어떤 방식이 더 적합하며, 그 이유는 무엇인가요?

2 DB 모델링
Medium

Q. 온라인 쇼핑몰에서 상품(Product)과 카테고리(Category)의 관계를 설계할 때, 하나의 상품이 여러 카테고리에 속할 수 있다면 JPA에서 어떻게 엔티티 관계를 매핑하시겠습니까? 연관관계 테이블의 필요성과 @ManyToMany 어노테이션 사용 시 주의사항을 설명해주세요.

A. 모범답안

상품과 카테고리는 다대다(M:N) 관계이므로 중간 연관관계 테이블(ProductCategory)이 필요합니다. @ManyToMany를 사용하면 JPA가 자동으로 중간 테이블을 생성하지만, 추가 속성(등록일, 정렬순서 등)을 넣을 수 없고 쿼리 제어가 어렵습니다. 실무에서는 중간 엔티티를 명시적으로 생성하고 @OneToMany, @ManyToOne으로 분리하는 것이 권장됩니다. 이렇게 하면 중간 테이블에 추가 컬럼을 자유롭게 추가할 수 있고, 쿼리 최적화와 비즈니스 로직 추가가 용이합니다.

핵심 포인트
  • • 다대다 관계는 중간 연관관계 테이블 필요
  • • @ManyToMany는 간단하지만 확장성 제한
  • • 중간 엔티티를 명시적으로 생성하여 @OneToMany/@ManyToOne으로 분리 권장
  • • 중간 테이블에 추가 속성(등록일, 순서 등) 관리 가능
Follow-up 질문

중간 엔티티를 사용할 때, 복합 키(Composite Key)를 사용하는 방식과 별도의 대리 키(Surrogate Key)를 사용하는 방식 중 어떤 것을 선호하며 그 이유는 무엇인가요?

3 보안
Medium

Q. Spring Security를 사용하여 JWT 기반 인증 시스템을 구현할 때, Access Token과 Refresh Token을 분리하는 이유와 각각의 저장 위치, 그리고 Token 갱신 프로세스를 설계하는 방법을 설명해주세요.

A. 모범답안

Access Token은 짧은 만료시간(15-30분)으로 API 요청 시 사용하며, Refresh Token은 긴 만료시간(7-14일)으로 Access Token 재발급에만 사용합니다. 이렇게 분리하면 Access Token 탈취 시 피해 기간을 최소화할 수 있습니다. Access Token은 클라이언트 메모리나 HttpOnly 쿠키에 저장하고, Refresh Token은 HttpOnly, Secure 속성의 쿠키에 저장하거나 서버 DB에 저장하여 관리합니다. Token 갱신 시에는 Refresh Token의 유효성을 검증하고 DB에 저장된 값과 비교한 후, 새로운 Access Token을 발급합니다. 필요시 Refresh Token도 함께 갱신하는 Refresh Token Rotation 전략을 사용할 수 있습니다.

핵심 포인트
  • • Access Token: 짧은 만료시간, API 요청용
  • • Refresh Token: 긴 만료시간, Access Token 재발급 전용
  • • HttpOnly, Secure 쿠키 사용으로 XSS 공격 방어
  • • Refresh Token은 서버 DB에 저장하여 검증 및 무효화 관리
  • • Refresh Token Rotation으로 보안 강화
Follow-up 질문

JWT를 사용할 때 로그아웃 기능을 구현하려면 어떻게 해야 하나요? Token의 Stateless 특성과 충돌하는 부분을 어떻게 해결할 수 있나요?

4 캐싱
Medium

Q. Spring Boot 애플리케이션에서 자주 조회되는 상품 정보를 캐싱하려고 합니다. @Cacheable, @CachePut, @CacheEvict 어노테이션의 역할을 설명하고, 캐시 전략(Cache-Aside, Write-Through)과 캐시 무효화 시점을 어떻게 설계하시겠습니까?

A. 모범답안

@Cacheable은 메서드 결과를 캐시에 저장하고 다음 호출 시 캐시에서 반환하며, @CachePut은 항상 메서드를 실행하고 결과를 캐시에 업데이트합니다. @CacheEvict는 캐시를 삭제하는 데 사용됩니다. Cache-Aside 패턴은 캐시 미스 시 DB 조회 후 캐시에 저장하는 방식으로 읽기가 많은 경우 적합하며, Write-Through는 쓰기 시 캐시와 DB에 동시 저장하여 일관성을 보장합니다. 상품 정보 조회는 @Cacheable로 캐싱하고, 상품 수정 시 @CachePut 또는 @CacheEvict로 캐시를 갱신하거나 무효화합니다. TTL(Time To Live)을 설정하여 일정 시간 후 자동 만료되도록 하고, 중요한 데이터 변경 시에는 명시적으로 캐시를 삭제합니다.

핵심 포인트
  • • @Cacheable: 조회 시 캐시 사용, 없으면 메서드 실행 후 저장
  • • @CachePut: 항상 실행 후 캐시 갱신
  • • @CacheEvict: 캐시 삭제/무효화
  • • Cache-Aside: 읽기 중심, 캐시 미스 시 DB 조회
  • • TTL 설정과 명시적 무효화 전략 조합
Follow-up 질문

Redis와 같은 외부 캐시를 사용할 때와 Spring의 로컬 캐시(ConcurrentMapCache)를 사용할 때의 차이점과 각각의 적합한 사용 사례는 무엇인가요?

5 확장성
Hard

Q. 사용자가 증가하여 단일 서버로 처리할 수 없는 상황에서, Spring Boot 애플리케이션을 다중 인스턴스로 확장(Scale-Out)할 때 고려해야 할 사항들을 설명해주세요. 특히 세션 관리, 파일 업로드, 스케줄링 작업에서 발생할 수 있는 문제와 해결 방법을 제시해주세요.

A. 모범답안

다중 인스턴스 환경에서는 세션을 서버 메모리에 저장하면 인스턴스 간 공유가 안 되므로, Spring Session과 Redis를 사용하여 외부 저장소에 세션을 관리해야 합니다. 파일 업로드는 로컬 디스크 대신 S3, NAS 같은 공유 스토리지를 사용하거나 CDN을 활용합니다. @Scheduled 어노테이션으로 구현한 스케줄링 작업은 모든 인스턴스에서 중복 실행되므로, ShedLock 라이브러리나 Quartz Scheduler의 클러스터 모드를 사용하여 단일 실행을 보장합니다. 또한 로드밸런서를 앞단에 배치하여 트래픽을 분산하고, 데이터베이스 커넥션 풀 설정도 인스턴스 수에 맞게 조정해야 합니다. 로깅은 중앙 집중식 로그 수집 시스템(ELK 스택 등)을 구축하여 관리합니다.

핵심 포인트
  • • 세션 관리: Spring Session + Redis로 외부 저장소 사용
  • • 파일 저장: S3, NAS 등 공유 스토리지 활용
  • • 스케줄링: ShedLock, Quartz 클러스터 모드로 중복 실행 방지
  • • 로드밸런서로 트래픽 분산
  • • DB 커넥션 풀 조정 및 중앙 로그 관리 시스템 구축
Follow-up 질문

Stateless한 애플리케이션 설계가 Scale-Out에 유리한 이유는 무엇이며, 기존 Stateful 애플리케이션을 Stateless로 전환할 때 어떤 부분을 리팩토링해야 하나요?

댓글 0

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

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