Java 신입 시스템 설계 기술면접

Java 신입 · 취준 (0~1년) 시스템 설계 10문항 조회수 65 · 2026-09-10 (목) 02:11:37
1 REST API 설계
Easy

Q. 사용자 정보를 관리하는 REST API를 설계한다고 할 때, 사용자 조회, 생성, 수정, 삭제 기능에 적합한 HTTP 메서드와 URL 구조를 어떻게 설계하시겠습니까?

RESTful 원칙에서 리소스는 명사로 표현하고, 행위는 HTTP 메서드로 표현합니다.

A. 모범답안

사용자 리소스는 '/users'로 표현하고, 조회는 GET /users 또는 GET /users/{id}, 생성은 POST /users, 수정은 PUT /users/{id} 또는 PATCH /users/{id}, 삭제는 DELETE /users/{id}로 설계합니다. URL에는 동사를 사용하지 않고 명사로 리소스를 표현하며, HTTP 메서드로 행위를 구분하는 것이 RESTful 설계 원칙입니다. PATCH는 부분 수정, PUT은 전체 수정에 사용하며, 상황에 맞게 선택할 수 있습니다.

핵심 포인트
  • • 리소스는 명사로 표현 (/users)
  • • HTTP 메서드로 행위 구분 (GET, POST, PUT, DELETE)
  • • URL에 동사 사용 지양
  • • PUT과 PATCH의 차이 이해
답변에 넣으면 좋은 키워드
REST HTTP 메서드 리소스 URI GET POST PUT DELETE PATCH
실무에서는

실제 백엔드 개발에서 API 엔드포인트를 설계할 때 RESTful 원칙을 따라 일관성 있는 인터페이스를 제공합니다.

Follow-up 질문

만약 사용자의 주문 목록을 조회하는 API를 추가한다면 URL을 어떻게 설계하시겠습니까?

2 레이어드 아키텍처
Easy

Q. Spring Boot 애플리케이션을 개발할 때 Controller, Service, Repository 계층으로 나누는 이유와 각 계층의 역할을 설명해주세요.

각 계층이 담당하는 책임을 분리하면 어떤 장점이 있는지 생각해보세요.

A. 모범답안

Controller는 HTTP 요청을 받아 응답을 반환하는 프레젠테이션 계층, Service는 비즈니스 로직을 처리하는 계층, Repository는 데이터베이스 접근을 담당하는 계층입니다. 이렇게 계층을 분리하면 각 계층의 책임이 명확해지고, 코드의 재사용성과 유지보수성이 향상됩니다. 또한 특정 계층의 변경이 다른 계층에 영향을 최소화하며, 테스트 작성도 용이해집니다. 예를 들어 데이터베이스를 MySQL에서 PostgreSQL로 변경할 때 Repository 계층만 수정하면 됩니다.

핵심 포인트
  • • Controller: HTTP 요청/응답 처리
  • • Service: 비즈니스 로직
  • • Repository: 데이터 접근
  • • 관심사의 분리와 유지보수성 향상
답변에 넣으면 좋은 키워드
레이어드 아키텍처 Controller Service Repository 관심사의 분리 유지보수성
실무에서는

실무에서 Spring Boot 애플리케이션을 개발할 때 표준적으로 사용하는 구조로, 팀 협업과 코드 관리에 필수적입니다.

Follow-up 질문

Service 계층에서 여러 Repository를 사용해야 하는 경우, 트랜잭션은 어떻게 관리해야 할까요?

3 API 응답 설계
Medium

Q. API 응답에서 성공과 실패를 구분하여 일관된 형식으로 클라이언트에 전달하려고 합니다. 어떤 정보들을 포함해야 하며, 어떻게 설계하시겠습니까?

HTTP 상태 코드와 응답 본문에 포함할 정보를 구분하여 생각해보세요.

A. 모범답안

API 응답은 HTTP 상태 코드와 응답 본문을 활용하여 설계합니다. 성공 시에는 200, 201 등의 상태 코드와 함께 data 필드에 실제 결과를 담고, 실패 시에는 400, 404, 500 등의 상태 코드와 함께 error 객체에 에러 코드, 메시지, 상세 정보를 포함합니다. 공통 응답 구조로 success(성공 여부), message(응답 메시지), data(실제 데이터), timestamp(응답 시간) 등을 포함하면 클라이언트에서 일관되게 처리할 수 있습니다. 특히 에러 응답에는 errorCode를 포함하여 클라이언트가 에러 유형별로 적절히 대응할 수 있도록 합니다.

핵심 포인트
  • • HTTP 상태 코드 활용
  • • 공통 응답 구조 정의
  • • 성공 시 data 필드, 실패 시 error 객체
  • • 에러 코드로 에러 유형 구분
답변에 넣으면 좋은 키워드
HTTP 상태 코드 공통 응답 포맷 에러 핸들링 errorCode API 일관성
실무에서는

프론트엔드와 백엔드 간 협업 시 일관된 API 응답 형식은 개발 효율성과 유지보수성을 크게 향상시킵니다.

Follow-up 질문

페이징 처리가 필요한 목록 조회 API의 경우 응답 구조를 어떻게 설계하시겠습니까?

4 데이터베이스 설계
Medium

Q. 게시판 서비스에서 게시글(Post)과 댓글(Comment)의 관계를 데이터베이스 테이블로 설계한다면, 어떤 구조로 설계하고 어떤 인덱스를 추가하시겠습니까?

두 테이블의 관계와 자주 조회되는 패턴을 고려해보세요.

A. 모범답안

Post 테이블에는 id(PK), title, content, author_id, created_at 등을 두고, Comment 테이블에는 id(PK), post_id(FK), content, author_id, created_at 등을 설계합니다. 이는 일대다 관계로 Comment 테이블의 post_id가 Post 테이블의 id를 참조합니다. 인덱스는 Comment 테이블의 post_id에 추가하여 특정 게시글의 댓글 조회 성능을 향상시키고, created_at에도 인덱스를 고려하여 최신순 정렬을 빠르게 처리할 수 있습니다. 복합 인덱스 (post_id, created_at)을 생성하면 특정 게시글의 댓글을 시간순으로 조회하는 쿼리가 더욱 효율적입니다.

핵심 포인트
  • • 일대다 관계로 FK 설정
  • • post_id에 인덱스 추가
  • • 조회 패턴에 따른 인덱스 설계
  • • 복합 인덱스 활용
답변에 넣으면 좋은 키워드
외래키 일대다 관계 인덱스 복합 인덱스 FK PK 조회 성능
실무에서는

실무에서 게시판, 댓글 시스템 등 계층적 데이터 구조를 설계할 때 성능과 확장성을 고려한 테이블 설계가 필요합니다.

Follow-up 질문

대댓글 기능을 추가한다면 테이블 구조를 어떻게 변경하시겠습니까?

5 캐싱 전략
Medium

Q. 자주 조회되지만 자주 변경되지 않는 상품 정보를 캐싱하려고 합니다. 어떤 캐싱 전략을 사용하고, 캐시 무효화는 어떻게 처리하시겠습니까?

조회와 갱신 빈도의 차이, 그리고 데이터 정합성을 함께 고려해보세요.

A. 모범답안

Look-Aside(Cache-Aside) 패턴을 사용하여 먼저 캐시를 조회하고, 캐시에 없으면 DB에서 조회 후 캐시에 저장하는 방식을 적용합니다. Redis와 같은 인메모리 캐시를 사용하며, TTL(Time To Live)을 설정하여 일정 시간 후 자동으로 만료되도록 합니다. 상품 정보가 수정될 때는 해당 상품의 캐시를 즉시 삭제(Cache Invalidation)하여 다음 조회 시 최신 데이터를 가져오도록 합니다. Spring의 @Cacheable, @CacheEvict 어노테이션을 활용하면 선언적으로 캐싱을 구현할 수 있습니다.

핵심 포인트
  • • Look-Aside 패턴 사용
  • • Redis 등 인메모리 캐시 활용
  • • TTL 설정
  • • 수정 시 캐시 무효화
답변에 넣으면 좋은 키워드
캐싱 Look-Aside Cache-Aside Redis TTL Cache Invalidation @Cacheable
실무에서는

이커머스 사이트에서 상품 상세 정보, 카테고리 정보 등 읽기가 많은 데이터의 응답 속도를 개선할 때 사용합니다.

Follow-up 질문

캐시 서버가 다운되었을 때 시스템이 정상 동작하도록 하려면 어떻게 설계해야 할까요?

6 API 버전 관리
Medium

Q. 운영 중인 API에 breaking change가 필요한 상황입니다. 기존 클라이언트는 계속 사용하면서 새로운 API도 제공하려면 어떻게 설계해야 할까요?

API 버전을 구분하는 여러 방법이 있습니다.

A. 모범답안

API 버전 관리는 URI에 버전을 포함하는 방식(/api/v1/users, /api/v2/users), Header에 버전 정보를 담는 방식(Accept: application/vnd.company.v2+json), 또는 Query Parameter로 전달하는 방식(?version=2) 등이 있습니다. 가장 명시적이고 직관적인 URI 버전 관리 방식을 권장하며, v1과 v2 컨트롤러를 별도로 구현하여 유지합니다. 기존 v1 API는 deprecation 공지 후 일정 기간 유지하다가 단계적으로 종료하며, 클라이언트에게 충분한 마이그레이션 기간을 제공합니다. 문서화도 버전별로 명확히 구분하여 제공해야 합니다.

핵심 포인트
  • • URI 버전 관리 방식 사용
  • • 기존 버전과 신규 버전 동시 운영
  • • 점진적 마이그레이션 계획
  • • 명확한 문서화
답변에 넣으면 좋은 키워드
API 버전 관리 breaking change deprecation 마이그레이션 하위 호환성
실무에서는

실무에서 API를 개선하거나 구조를 변경할 때 기존 클라이언트에 영향을 주지 않으면서 점진적으로 업데이트하는 데 필수적입니다.

Follow-up 질문

특정 API 버전을 완전히 종료하기 전에 어떤 절차를 거쳐야 할까요?

7 확장성
Hard

Q. 사용자가 급증하여 단일 서버로 처리할 수 없는 상황입니다. 애플리케이션 서버를 수평 확장(Scale-out)할 때 고려해야 할 사항과 세션 관리 방법을 설명해주세요.

여러 서버에 분산된 환경에서 상태 정보를 어떻게 공유할지 생각해보세요.

A. 모범답안

수평 확장 시 로드밸런서를 앞단에 두고 여러 애플리케이션 서버로 트래픽을 분산시킵니다. 이때 각 서버는 Stateless하게 설계되어야 하며, 세션 정보는 서버 메모리가 아닌 외부 저장소에 보관해야 합니다. Redis와 같은 중앙 세션 저장소를 사용하거나, JWT 토큰 기반 인증으로 서버에 세션을 저장하지 않는 방식을 선택할 수 있습니다. 데이터베이스 커넥션 풀 설정도 서버 수에 맞게 조정해야 하며, 파일 업로드와 같은 공유 리소스는 S3 같은 외부 스토리지를 활용합니다. 로그도 중앙 집중식 로깅 시스템을 구축하여 관리해야 합니다.

핵심 포인트
  • • Stateless 서버 설계
  • • 중앙 세션 저장소(Redis) 또는 JWT 사용
  • • 로드밸런서 활용
  • • 공유 리소스 외부화
답변에 넣으면 좋은 키워드
수평 확장 Scale-out 로드밸런서 Stateless 세션 관리 Redis JWT
실무에서는

트래픽이 증가하는 서비스에서 안정적인 서비스를 제공하기 위해 필수적으로 고려해야 하는 아키텍처 설계입니다.

Follow-up 질문

데이터베이스도 병목이 발생한다면 어떤 방법으로 확장할 수 있을까요?

8 API 인증/인가
Medium

Q. 회원 전용 API를 개발할 때 사용자 인증과 인가를 어떻게 구현하시겠습니까? JWT와 세션 기반 인증의 차이점도 함께 설명해주세요.

인증은 신원 확인, 인가는 권한 확인입니다. 상태 저장 여부가 중요한 차이점입니다.

A. 모범답안

인증(Authentication)은 사용자가 누구인지 확인하는 것이고, 인가(Authorization)는 해당 사용자가 특정 리소스에 접근할 권한이 있는지 확인하는 것입니다. 세션 기반 인증은 서버에 세션 정보를 저장하고 클라이언트에게 세션 ID를 쿠키로 전달하는 Stateful 방식입니다. JWT 기반 인증은 토큰 자체에 사용자 정보를 포함하여 서버에 상태를 저장하지 않는 Stateless 방식으로, 수평 확장에 유리합니다. JWT는 Access Token과 Refresh Token을 함께 사용하여 보안성을 높이며, Spring Security와 같은 프레임워크를 활용하여 구현할 수 있습니다.

핵심 포인트
  • • 인증과 인가의 차이
  • • 세션 기반: Stateful, 서버에 상태 저장
  • • JWT: Stateless, 토큰에 정보 포함
  • • Access Token과 Refresh Token 활용
답변에 넣으면 좋은 키워드
인증 인가 JWT 세션 Access Token Refresh Token Spring Security
실무에서는

회원 시스템이 있는 대부분의 웹 서비스에서 사용자를 식별하고 권한을 관리하는 데 사용됩니다.

Follow-up 질문

JWT 토큰이 탈취되었을 때 어떻게 대응할 수 있을까요?

9 페이징 처리
Easy

Q. 게시글 목록을 조회하는 API에서 한 번에 모든 데이터를 반환하면 성능 문제가 발생합니다. 페이징 처리를 어떻게 설계하시겠습니까?

클라이언트가 필요한 페이지와 크기 정보를 어떻게 전달하고, 응답에는 어떤 정보를 포함해야 할지 생각해보세요.

A. 모범답안

페이징 처리는 Query Parameter로 page(페이지 번호)와 size(페이지 크기)를 받아 처리합니다. 예를 들어 GET /posts?page=1&size=10 형태로 요청을 받습니다. 응답에는 실제 데이터 목록뿐만 아니라 totalElements(전체 데이터 수), totalPages(전체 페이지 수), currentPage(현재 페이지), size(페이지 크기), hasNext(다음 페이지 존재 여부) 등의 메타 정보를 포함합니다. Spring Data JPA의 Pageable과 Page 인터페이스를 활용하면 쉽게 구현할 수 있으며, 데이터베이스 쿼리는 LIMIT과 OFFSET을 사용합니다.

핵심 포인트
  • • page, size 파라미터로 페이징 정보 전달
  • • 메타 정보 포함 응답
  • • Spring Data JPA의 Pageable 활용
  • • LIMIT, OFFSET 쿼리
답변에 넣으면 좋은 키워드
페이징 Pageable Page LIMIT OFFSET totalElements 메타 정보
실무에서는

게시판, 상품 목록, 검색 결과 등 대량의 데이터를 효율적으로 조회하는 모든 API에서 사용됩니다.

Follow-up 질문

OFFSET 기반 페이징의 성능 문제와 이를 개선할 수 있는 Cursor 기반 페이징에 대해 설명해주세요.

10 에러 처리 설계
Medium

Q. 애플리케이션에서 발생하는 다양한 예외를 일관되게 처리하고 클라이언트에게 적절한 에러 응답을 제공하려면 어떻게 설계해야 할까요?

예외를 한 곳에서 처리하고 에러 유형별로 적절한 HTTP 상태 코드를 매핑하는 방법을 고려해보세요.

A. 모범답안

Spring의 @ControllerAdvice와 @ExceptionHandler를 사용하여 전역 예외 처리기를 구현합니다. 비즈니스 예외는 커스텀 예외 클래스를 정의하고, 각 예외 유형별로 적절한 HTTP 상태 코드를 매핑합니다. 예를 들어 NotFoundException은 404, InvalidInputException은 400, UnauthorizedException은 401로 응답합니다. 에러 응답 형식은 errorCode, message, details, timestamp 등을 포함하여 일관되게 유지하며, 개발 환경에서는 stack trace를 포함하되 운영 환경에서는 제외합니다. 로그는 적절한 레벨로 기록하여 모니터링과 디버깅에 활용합니다.

핵심 포인트
  • • @ControllerAdvice로 전역 예외 처리
  • • 커스텀 예외와 HTTP 상태 코드 매핑
  • • 일관된 에러 응답 형식
  • • 환경별 에러 정보 차등 제공
답변에 넣으면 좋은 키워드
@ControllerAdvice @ExceptionHandler 전역 예외 처리 커스텀 예외 HTTP 상태 코드
실무에서는

실무에서 안정적인 API를 제공하고 클라이언트가 에러를 적절히 처리할 수 있도록 하는 데 필수적입니다.

Follow-up 질문

예상치 못한 RuntimeException이 발생했을 때는 어떻게 처리해야 할까요?

댓글 0

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

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