Spring 기술면접 예상질문 미리보기 <4>

Annotation, Spring Security 구조와 JWT 발급 과정, N+1 문제, 즉시로딩/지연로딩. 뭐라고 답해야 할까?
May 17, 2024
Spring 기술면접 예상질문 미리보기 <4>
 

Q (1). Annotation이란 무엇이고 구체적으로 어떤 것이 있는지 예시를 들어 설명해주실 수 있을까요?

핵심 키워드 : 메타데이터, 주석(과의 차이), 리플렉션

수강생 답변

Annotation은 클래스, 메서드, 파라미터, 필드 등에 특별한 표식을 남기기 위해 사용하는 것으로 그 자체로는 특별한 기능은 없습니다. 하지만 Reflection을 이용하면 특정 Annotation이 남겨진 클래스, 메서드, 파라미터, 필드 등에 값을 주입한다든지 기록을 남긴다든지 등의 업무를 수행할 수 있습니다.
구체적인 예시를 들어보자면, @Autowired라는 어노테이션이 존재하는데 해당 어노테이션이 필드에 붙는다면, Bean Container가 해당 필드의 타입에 부합하는 Bean을 찾아서 주입해 줍니다. 뿐만 아니라 @Component라는 어노테이션도 존재하는데 해당 어노테이션이 붙은 클래스들은 역시나 Bean Container 안에 담기게 됩니다. 이처럼 Annotation으로 표식을 남길 수 있고 특수한 프로세서에 의해 특정 업무를 처리할 수 있습니다.
 

멘토님 피드백

어노테이션의 대한 정의와 역할을 잘 설명하고 있는데, 한 가지 아쉬운 점이 있습니다. "@Component라는 어노테이션도 존재하는데 해당 어노테이션이 붙은 클래스들은 역시나 Bean Container 안에 담기게 됩니다. " 이 부분에서 인스턴스화 되서 Bean Container로 담기게 된다고 수정해야 더 올바른 표현으로 보여집니다.
 

😄 좋은 부분

  • 어노테이션의 정의와 역할을 잘 설명하고 있는 부분 ” Annotation은 클래스, 메서드, 파라미터, 필드 등에 특별한 표식을 남기기 위해 사용하는 것으로 그 자체로는 특별한 기능은 없습니다. 하지만 Reflection을 이용하면 특정 Annotation이 남겨진 클래스, 메서드, 파라미터, 필드 등에 값을 주입한다든지 기록을 남긴다든지 등의 업무를 수행할 수 있습니다.”

🤔 아쉬운 부분

  • @Component 어노테이션 설명이 부족한 부분
    • “@Component라는 어노테이션도 존재하는데, 해당 어노테이션이 붙은 클래스들은 Bean Container에 의해 인스턴스화되어 Bean으로 등록됩니다.” 로 수정
 
 

Q (2). Spring Security의 구조와 JWT 발급 과정에 대해 설명해주실 수 있을까요?

핵심 키워드 : 인증과 인가, 보안, 서블릿, 필터, 검증, 서명

수강생 답변

Spring Security는 다양한 보안 레이어 및 컴포넌트로 구성되어 있습니다. 가장 일반적인 구조로는 Authentication Manager, Security Filter Chain 그리고 UserDetailsService가 있습니다. Authentication Manager는 사용자의 인증을 처리하고 사용자의 신원을 확인하는 역할을 담당합니다. 이를 위해 In-Memory, JDBC, LDAP, OAuth 등 다양한 인증 프로바이더를 지원하며, 필요에 따라 커스텀 인증 로직을 구현할 수도 있습니다. Security Filter Chain은 다양한 보안 필터가 연결된 필터 체인으로, 요청을 처리하고 응답을 생성하기 전에 인증, 권한 부여, CSRF(Cross-Site Request Forgery) 방지 등 다양한 보안 검사를 수행합니다. UserDetailsService는 사용자의 신원을 확인하기 위해 사용자 정보를 제공하는 인터페이스로, 주로 데이터베이스나 사용자 저장소로부터 사용자 정보를 검색하여 인증 매니저가 사용자를 확인하는 데 사용됩니다.
 
Spring Security에서 JWT (JSON Web Token)는 인증된 사용자에게 토큰을 발급하고 이를 사용하여 사용자의 신원을 확인하는 프로세스에 사용됩니다. JWT 발급 과정은 다음과 같습니다. 먼저 사용자가 자격 증명 (아이디 및 비밀번호)을 제출하여 로그인을 시도하면, Spring Security는 UserDetailsService를 통해 사용자 정보를 검색하고, PasswordEncoder를 사용하여 비밀번호 일치 여부를 확인하여 사용자를 인증하고 신원을 확인합니다.
사용자가 성공적으로 인증되면 서버는 사용자 정보 및 권한이 포함된 JWT를 생성하고, 서명 키를 사용하여 JWT를 서명한 후 클라이언트에게 반환합니다. 이 JWT는 일반적으로 HTTP 헤더에 포함되거나, 응답 본문에 담겨서 클라이언트에게 전달됩니다. 이후 사용자가 보호된 엔드포인트에 요청을 보낼 때, JWT는 요청의 Authorization 헤더나 쿼리 매개변수 등을 통해 서버로 전송되고, 서버는 클라이언트로부터 수신한 JWT의 서명을 검증하고 만료 시간 및 기타 클레임 정보를 확인하여 유효성을 검사합니다. JWT가 유효하다면 요청된 리소스에 대한 액세스를 허용하거나 거부하며, 클라이언트는 JWT에 포함된 권한에 따라 요청된 작업을 수행할 수 있게 됩니다. 이러한 일련의 과정을 통해 Spring Security에서 JWT를 사용하여 사용자 인증 및 권한 부여를 구현할 수 있으며, 보안 및 인증을 효과적으로 관리할 수 있습니다.
 

멘토님 피드백

핵심적인 키워드를 중심으로 Spring Security의 구조와 JWT 발급 과정에 대해 아주 잘 답변했습니다. 이 답변은 면접을 하루 앞두고 간단하게 복습하기에 좋은 내용으로 판단됩니다.
 

😄 좋은 부분

  • 핵심적인 키워드를 중심으로 Spring Security의 구조를 잘 설명한 부분
    • Authentication Manager, Security Filter Chain, UserDetailsService, 인증 프로바이더
    •  
  • 핵심적인 키워드를 중심으로 JWT 발급 과정을 잘 설명한 부분
    • 토큰 발급, 사용자의 신원 확인, JWT 발급 과정, JWT 유효성 검사
    •  
 

Q (3). N+1 문제의 발생 이유와 해결 방법에 대해 설명해주실 수 있을까요? 해결 방법은 3가지 이상 말씀해주시면 좋습니다.

핵심 키워드 : 지연 로딩, 조인, 연관 관계

수강생 답변

N+1 문제는 주로 데이터베이스에서 데이터를 가져올 때 발생하는 성능 문제입니다. 이 문제는 다음과 같이 발생합니다. 첫째, 1번 쿼리에서 N개의 아이템을 가져옵니다. 예를 들어, 여러 사용자의 정보를 가져올 때, 첫 번째 쿼리로 사용자 목록을 가져오는데, 이때 N은 사용자의 수를 나타냅니다. 둘째, N번의 쿼리를 통해 개별 사용자 정보를 가져옵니다. 각 사용자에 대한 추가 정보(예: 프로필 사진, 주소)를 얻기 위해 각 사용자에 대해 별도의 쿼리를 실행하는 것입니다. 이것이 N+1에서 N+1 문제로 이름 붙은 이유입니다. 예를 들어, 10명의 사용자를 가져온다고 가정하면, 1번 쿼리로 10명의 사용자 목록을 가져오고, 그 다음 10번의 추가 쿼리를 실행하여 각 사용자의 개별 정보를 가져오게 됩니다.
이러한 N+1 문제를 해결하기 위한 방법으로는 다음과 같은 것들이 있습니다. 첫째, Eager Loading입니다. 이는 모든 정보를 한 번에 가져오는 방법으로, 1번 쿼리에서 모든 데이터를 가져올 수 있습니다. 그러나 모든 정보가 필요하지 않을 때는 낭비가 될 수 있습니다. 둘째, Fetch Join입니다. 데이터베이스 쿼리에 JOIN FETCH를 사용하여 추가 정보를 한 번에 가져올 수 있습니다. 이 방법은 Eager Loading과 유사하지만 정확하게 필요한 정보만 가져올 수 있습니다. 셋째, Batch Fetching입니다. 여러 쿼리를 일괄로 실행하여 추가 정보를 가져오는 방법으로, 일부 ORM 라이브러리에서 지원됩니다. 넷째, DTO 사용입니다. 필요한 정보만 선택적으로 가져오는 방식으로, N+1 문제를 피하면서 필요한 정보만 가져올 수 있습니다.
간단하게 말하면, N+1 문제는 데이터를 효율적으로 가져오기 위한 방법을 고민하는 것이며, 이러한 방법 중 하나를 선택하여 성능을 최적화할 수 있습니다.
 

멘토님 피드백

N+1 문제의 원인을 자세하게 설명하고 있고, N+1 해결 방법을 핵심 키워드로 자세하게 정리한 좋은 답변입니다.
 

😄 좋은 부분

  • N+1 문제의 원인을 자세하게 설명하고 있는 부분
    • “첫째, 1번 쿼리에서 N개의 아이템을 가져옵니다. 예를 들어, 여러 사용자의 정보를 가져올 때, 첫 번째 쿼리로 사용자 목록을 가져오는데, 이때 N은 사용자의 수를 나타냅니다. 둘째, N번의 쿼리를 통해 개별 사용자 정보를 가져옵니다. 각 사용자에 대한 추가 정보(예: 프로필 사진, 주소)를 얻기 위해 각 사용자에 대해 별도의 쿼리를 실행하는 것입니다.”
       
  • N+1 문제 해결 방법을 핵심 키워드로 설명하고 있는 부분
    • Eager Loading
    • Fetch Join
    • Batch Fetching
    • DTO
 
 

Q (4). 즉시로딩과 지연로딩은 각각 언제 사용하면 좋은지 설명해주실 수 있을까요?

핵심 키워드 : 프록시 객체, 조회 시점

수강생 답변

즉시로딩(Eager Loading)과 지연로딩(Lazy Loading)은 ORM(Object-Relational Mapping)을 사용하는 애플리케이션에서 데이터를 가져오는 방식을 나타냅니다. 어떤 방식을 선택해야 하는지는 상황에 따라 다릅니다. 즉시로딩은 관련된 모든 데이터를 한 번에 가져오는 방식입니다. 즉, 연관 엔티티와 그에 속한 데이터를 모두 즉시 로딩하며, 데이터를 가져오는 쿼리가 실행될 때 함께 가져와집니다. 주로 @ManyToOne 또는 @OneToOne 관계에서 사용됩니다. 즉시로딩은 연관 엔티티가 항상 필요하며, 부가적인 쿼리 비용을 감수해야 하는 경우, 데이터의 양이 작고 성능 영향이 미미한 경우, 그리고 데이터베이스의 데이터 무결성 규칙을 지켜야 하는 경우에 사용하는 것이 좋습니다.
반면에 지연로딩은 연관된 데이터를 실제로 사용할 때까지 가져오지 않는 방식입니다. 데이터를 처음에는 가져오지 않고, 필요한 순간에 추가 쿼리로 데이터를 가져옵니다. 필요한 때에만 데이터베이스 쿼리를 실행하기 때문에 초기 데이터베이스 액세스 비용을 절감할 수 있습니다. 주로 @OneToMany 또는 @ManyToMany 관계에서 사용됩니다. 지연로딩은 연관된 데이터를 필요한 경우에만 가져오고, 불필요한 데이터베이스 액세스를 피하려는 경우, 대규모 데이터베이스에서 데이터의 양이 크고 성능에 민감한 경우, 그리고 사용자 요청에 따라 데이터를 동적으로 로드해야 하는 경우에 사용하는 것이 좋습니다.
어떤 방식을 선택할지 결정하는 요소로는 데이터 양, 애플리케이션 요구사항, 성능, 그리고 데이터 무결성이 있습니다. 데이터가 큰 경우에는 즉시로딩이 많은 데이터를 가져와 메모리 부담을 줄 수 있으므로 지연로딩이 유용합니다. 애플리케이션의 요구사항에 따라 어떤 데이터를 언제 필요로 하는지 고려해야 하며, 성능 요구 사항에 따라 어떤 방식을 선택할 것인지 결정해야 합니다. 또한 데이터베이스의 데이터 무결성 규칙을 준수해야 하는 경우에는 즉시로딩을 사용할 수 있습니다.
일반적으로는 필요한 순간에 데이터를 가져오는 지연로딩을 사용하여 성능을 최적화하며, 필요한 경우에만 데이터를 즉시로딩으로 가져올 수 있도록 설계하는 것이 좋습니다.
 

멘토님 피드백

즉시로딩과 지연로딩에 대한 정의와 특징을 테이블 관계도를 기준으로 잘 설명하고 있으며, 어떤 방식을 어떻게 선택하여 적용해야 하는지도 명확하게 설명하고 있어서 좋은 답변입니다.
 

😄 좋은 부분

  • 즉시로딩과 지연로딩에 대한 정의와 특징을 테이블 관계도를 기준으로 설명하고 있는 부분
    • “즉시로딩은 관련된 모든 데이터를 한 번에 가져오는 방식입니다. 즉, 연관 엔티티와 그에 속한 데이터를 모두 즉시 로딩하며, 데이터를 가져오는 쿼리가 실행될 때 함께 가져와집니다. 주로 @ManyToOne 또는 @OneToOne 관계에서 사용됩니다.”
      “지연로딩은 연관된 데이터를 실제로 사용할 때까지 가져오지 않는 방식입니다. 데이터를 처음에는 가져오지 않고, 필요한 순간에 추가 쿼리로 데이터를 가져옵니다. 필요한 때에만 데이터베이스 쿼리를 실행하기 때문에 초기 데이터베이스 액세스 비용을 절감할 수 있습니다. 주로 @OneToMany 또는 @ManyToMany 관계에서 사용됩니다.”
 
  • 즉시로딩과 지연로딩 중 어떤 방식을 선택해야 할지 명확하게 설명하고 있는 부분
    • “데이터가 큰 경우에는 즉시로딩이 많은 데이터를 가져와 메모리 부담을 줄 수 있으므로 지연로딩이 유용합니다.”
      “데이터베이스의 데이터 무결성 규칙을 준수해야 하는 경우에는 즉시로딩을 사용할 수 있습니다.”
 
 
 
스프링 (Spring) 기술 면접 질문, 도움이 되셨나요? 기술면접 대비는 현직 개발자의 시선에서 어떤 답변이 좋을 지를 파악할 수 있어서 취업 리부트 코스 수강생들의 만족도가 가장 높은 세션 중 하나 인데요. 앞으로도 React, Spring의 기술면접 Q&A를 꾸준히 발행할 예정이니, 관심이 있다면 항해99 블로그를 구독해주세요.
 
 

🚢 개발자 취업 준비 어떻게 시작해야 할지 모르겠나요? 취업으로 향하는 거친 항해에서 든든한 메이트가 되어 드리겠습니다.

취업 실패 시 교육비 0원. 반드시 취업까지 책임질 수 있다는 항해의 자신감입니다.
높은 수준의 개인 프로젝트 경험이 없는 개발 유관 전공자, 전반적인 학습이 부족한 부트캠프 수료생이라면 개발자 취업 리부트 코스에 합류하세요. 자료구조 공부, 프로젝트, 코테준비, 이력서와 면접 대비까지 취업 리부트 코스에서 한 번에 할 수 있습니다. 갈수록 높아지는 개발자 취업의 벽, 개발자 취업 리부트 코스로 11주 만에 취업의 문을 열어 보세요
 
 
 
CREDIT
글 | 송민영 팀스파르타 에디터
 
Share article
Subscribe to our newsletter

IT 커리어 성장 코스, 항해