++/CS

[TIL] CS공부 5일차

writtenbyrla 2024. 3. 9. 11:55

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

어노테이션은 주석이라는 의미로, 다른 프로그램에 유용한 정보를 제공하기 위해 사용됩니다.
프로그램 빌드 시 코드를 자동으로 생성할 수 있도록 정보를 제공하고, 런타임에 특정 기능을 실행하도록 정보를 제공합니다. 
어노테이션을 사용함으로써 코드를 더 간결하게 하여 코드작성 시 생산성이 증가하며 유지보수하기 쉽다는 장점이 있습니다.

종류 및 예시
@Component 
개발자가 직접 작성한 클래스를 인스턴스화하여 Bean으로 등록하기 위해 사용합니다. 실제로 프로젝트에서 토큰을 생성하고 인증하는 TokenProvider 클래스와 JwtAuthenticationFilter에 적용하여 사용하였습니다.

@Bean
개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들 때 사용합니다.
예를 들어, 패스워드 암호화를 하기 위해 SecurityConfig에서 Spring Security의 PasswordEncoder를 Bean으로 생성하고 회원가입 및 로그인 시에 Service단에서 생성자를 통해 PasswordEncoder를 이용합니다.

이 외에도 Lombok 라이브러리에서 제공하는 @NoArgsConstructor @Setter @Getter @ToString 등을 사용하면 직접 클래스에서 생성자, getter, setter tostring을 위한 코드를 직접 작성하지 않아도 됩니다.

 

 

 

 


 

 

 

 

 

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

Spring Security는 Spring 기반의 애플리케이션에서 보안 관련 작업을 담당하는 프레임워크입니다. 주로 인증(Authentication)과 권한 부여(Authorization)를 다루며, 이를 통해 애플리케이션의 보안을 강화합니다.

Spring Security 구조
SecurityFilterChain
HTTP 요청이 서버에 도달하기 전과 후에 요청을 필터링하고, 보안 관련 작업을 수행합니다.

UserDetailsService
사용자 정보를 가져오는 인터페이스로 주로 사용자 인증에 사용되며, 인증객체 생성 시 userdetail를 담아 인증객체를 생성합니다.

Authentication
인증을 처리하는 핵심 인터페이스입니다. 주어진 인증 요청을 처리하고 인증 객체를 반환합니다.

SecurityContextHolder
현재 인증된 사용자의 세부 정보를 저장합니다.

JWT 발급 과정
로그인 요청, 인증 확인
사용자가 로그인을 하면 인증 요청이 발생하고, 서버는 요청한 사용자의 정보를 확인하는 인증 처리를 거칩니다.

JWT 생성
인증이 성공하면 서버는 사용자에 대한 정보를 최소한으로 담아 JWT를 생성합니다.

응답반환
로그인 성공 시 발급된 JWT를 클라이언트로 반환하는데, 보통 HTTP 응답 헤더나 응답 본문에 포함하여 전송합니다. 

++ 요청과 검증
클라이언트는 로그인 후 서버에서 응답받은 JWT를 세션이나 쿠키 등 브라우저에 저장해두었다가 인증이 필요한 엔드포인트에 접근하기 위해 저장된 JWT를 다시 담아 요청합니다. 서버에서는 들어온 요청을 처리하기 위해 JWT 유효성 검사를 하고 인증하는 과정을 거치게 됩니다.

 

 

 

 


 

 

 

 

 

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

N+1 문제란 데이터를 로드할 때 발생하는 성능 문제로 한 번의 쿼리로 가져와야 할 데이터를 여러 번의 추가 쿼리를 요청함으로써 성능이 저하되는 문제를 말합니다.
N+1 문제가 발생하는 이유는 JPA에서 데이터를 조회하는 기본 방식인 지연 로딩 때문입니다. 지연 로딩이란 어떤 객체를 조회할 때 연관 관계에 있는 엔티티를 바로 로딩하지 않고 나중에 필요할 때 로딩하는 것으로, 연관관계에 있는 엔티티를 조회하는 N개의 쿼리가 별도로 실행되어 성능저하의 요인이 됩니다.

해결방법
Fetch Join
가장 일반적인 방법으로 관련된 테이블 간 조인을 사용해 모든 데이터를 한 번의 질의로 가지고 올 수 있게 합니다. 하지만 Pagination과 fetch join을 함께 사용할 경우 N+1 문제는 해결할 수 있지만 모든 데이터를 조회한 후에 페이징 작업을 하기 때문에 더 큰 성능저하를 유발할 수 있습니다. 

Batch Size
데이터를 읽어올 때 한 번에 가져오는 데이터의 양을 조절하는 방법으로 select문의 where절에서 하나씩 조회하는 것이 아니라 in을 이용하여 한꺼번에 조회할 수 있게 되어 조회하는 쿼리문을 실행하는 절대적인 시간을 단축할 수 있습니다.

Entity Graph
Entity Graph는 엔티티를 로드할 때 필요한 연관 엔티티의 필드를 어노테이션으로 지정하여 함께 로드하도록 지정하는 방법으로, 한 번의 쿼리로 여러 엔티티를 로드할 수 있습니다.

 

++ N+1 해결 경험이 있으신가요?

프로젝트 당시 게시글 목록 조회 시 댓글, 좋아요, 멀티미디어 목록을 함께 조회해서 반환해야 하는데 연관관계에 있는 엔티티를 조회하는 쿼리문이 각각 요청되어 N+1 문제가 발생하였습니다.
처음에 fetch join만 이용하여 한번에 모든 데이터를 조회하는 방식으로 해결하려고 했지만, Pagination이 적용되어 있어 성능저하가 일어났습니다. 따라서 1:N 관계에 있는 엔티티는 fetch join을 이용하고 N:1 관계에 있는 엔티티는 batch size를 이용해서 해결하였습니다.

 

'++ > CS' 카테고리의 다른 글

[TIL] CS공부 7일차  (0) 2024.03.12
[TIL] CS공부 6일차  (0) 2024.03.11
[TIL] CS공부 4일차  (0) 2024.03.08
[TIL] CS공부 3일차  (0) 2024.03.07
[TIL] CS공부 2일차  (0) 2024.03.06