종우의 삶 (전체 공개)

쉬어가기 - Spring의 기본 지식 확인하기 본문

개발/Spring

쉬어가기 - Spring의 기본 지식 확인하기

jonggae 2024. 8. 7. 14:49

Spring에는 Bean의 동작 원리나, Spring에서의 의존성, IoC, DI등 중요한 사항들이 있다. 면접에서 이러한 것들을 수월하게 대답할 수 있도록 준비해보는 시간을 가져보자.


1. IoC

프로그램의 제어 흐름을 개발자가 아닌 프레임워크가 관리하는 디자인 패턴이다. (그래서 역전)
객체간의 결합도를 낮추고 유연하고 확장성이 큰 프로그램을 만든다.
Spring 컨테이너가 애플리케이션의 객체 생성, 관계 설정, 생명주기를 관리함.
코드의 재사용성이 증가하고, 객체 간 결합도가 감소하고, 모듈화 되고 테스트가 쉬워진다.
@Autowired, @Component같은 어노테이션으로 구현

 

2. DI

의존성 주입
객체가 필요로 하는 의존성을 외부에서 주입하는 기술.
객체 간의 결합도를 낮추고 코드의 재사용성을 높인다.
생성자 주입, 세터 주입, 필드 주입으로 사용가능하다.  (생성자 주입을 권장)
코드의 재사용성 증가, 리팩토링, 테스트에 용이하다.

 

3. AOP ★(잘 모르겠음)

관점 지향 프로그래밍
핵심 비즈니스 로직과 부가 기능을 분리하여 코드의 재사용성과 유지보수성을 높임
로깅, 트랜잭션 관리, 보안, 캐싱 등에 사용

 

4. Spring Bean & Bean lifecycle

Bean
Spring IoC 컨테이너가 관리하는 자바 객체
Bean 생성 방법
1. @Component, @Service, @Repository, @Controller 어노테이션 사용
2. Java Config에서 @Bean 사용
3. XML 설정 사용

Bean Lifecycle
1. 인스턴스화 : Bean 객체 생성
2. 프로퍼티 설정 : DI 수행
3. 초기화 콜백 
4. 사용
5. 소멸 콜백

* Singleton : 애플리케이션당 하나의 인스턴스

 

5. Spring MVC

웹 애플리케이션 개발을 위한 Spring 프레임워크의 모듈
Model - View - Controller
사용자 인터페이스와 비즈니스 로직을 분리하여 개발의 유연성과 재사용성을 높임.

1. DispatcherServlet
- 프론트 컨트롤러 역할
- 모든 HTTP  요청을 적절한 컴포넌트로 위임
- Java 설정을 통해 구성

2. HandlerMapping
- 요청들을 매핑

3. Controller
- 요청을 처리하고 Model을 생성함
- @Controller 사용

4. Model & View
- 컨트롤러가 처리한 결과 데이터와 뷰 정보 포함

5. View
- 실제 사용자에게 보여질 화면을 렌더링, JSP, Thymeleaf 등 사용

동작 흐름
1. 클라이언트가 요청을 보내면 DispatcherServelet 이 요청을 받고, Mapping을 통해 처리할 Controller를 찾는다.
2. Controller는비즈니스 로직을 처리하고 결과를 Model에 담아 View 이름과 함께 반환
3. DispatcherServlet은 ViewResolver를 통해 실제 View를 찾고 Model 데이터를 사용해 화면을 렌더링
4. 클라이언트에게 응답으로 반환

 

6. Spring Security

Spring 기반 애플리케이션의 보안을 담당하는 프레임워크. 인증과 권한 부여를 통해 보안을 강화. 
주요 기능으로는 인증, 권한부여, 보안 필터 체인등이 있다. 

기본적으로 세션 방식의 폼 기반 인증(폼 로그인) 기능을 제공하며, HTTP Basic 인증, OAuth등도 있음. 
권한은 특정 URL에 대한 접근 권한을 설정하는 것. @PreAuthorize 등을 이용하여 메서드 수준에서 제어가능

별다른 설정이 없을 때 세션 기반의 폼 로그인 과정
1. 사용자가 로그인을 제출함 (username, password)
2. 서버는 이 정보를 검증
3. 검증이 성공하면 서버가 세션을 생성
4. 클라이언트에게 세션 ID를 담은 쿠키를 전송
5. 이후 클라이언트의 모든  요청에는 세션 ID가 포함

세션은 서버 측에서 관리되기 때문에 세션 ID가 필요한 것이다. 상태가 유지되는 방식으로 JWT와 차이가 있다. 요청을 할때마다 서버의 세션 조회가 필요함. (단점이 될 수 있음)

보안 필터 체인
사용자의 HTTP 요청이 애플리케이션에 도달하기 전에 거치는 필터들이다. 보안처리에 주요 사용되는 핵심 메커니즘이다. 
폼 로그인 또한 필터 체인을 거쳐서 완성되는 것이다. 각 커스텀 필터들을 생성할 수 있고 순서에 유의하여야 한다. 예를들어 인증 필터가 권한 체크 필터보다 먼저 실행되어야 하는 부분. JWT 부분에서 더 많이 사용될 것이다.

--추가 사항
CSRF, CORS
CORS는 다른 출처(Origin)의 리소스를 공유할 수 있게 하는 메커니즘. 서버가 리소스에 접근할 수 있는 출처를 명시적으로 알려주는 방식으로 동작
CSRF는 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격
공격이므로 방어를 해야한다. 

 

6-1. JWT

JWT는 Spring Security와 함께 사용자 관리 기능을 구현하는데 사용된다. 기본적인 시큐리티 프레임워크에 추가적으로 JWT 설정을 더하는 것이다.

JWT는 기본적으로 헤더, 페이로드, 서명으로 이루어져있으며 클레임이라 불리는 사용자의 주요 정보들은 이곳에 들어있다. 헤더와 페이로드는 토큰자체의 정보가 들어있으며, 암호화 알고리즘이 여기에 들어있다. 
Security내부의 필터들을 잘 조정하면 JWT를 포함한 인증과정을 구현할 수 있으며, 
AuthenticaionFilter, AuthenticationManager, Provider등의 필터가 포함되고, UserDetailsService를 통해 사용자 정보를 확인한다. DB에 저장된 값과 일치하는, 즉 인증된 회원이라면 Authenticaion 객체를 생성하게되며 인증이 완료된다. 이 인증객체는 SecurityContext 내부에 저장되어 어플리케이션 전반에 해당 스레드에 포함된 정보를 사용할 수 있다. 

JWT는 인증이 완료되고 난 후 별개의 SuccessHandler를 구현하여 생성되는데, 이 토큰에 포함될 정보나 암호화 로직, 비밀 키 등을 설정한다. 내부적으로 인증이 완료되면 생성된 JWT를 클라이언트에게 전달하고, 클라이언트는 이것을 요청 헤더에 포함하여 서버의 인증을 받게된다. 권한이나 그런것들

JWT는 클라이언트 쪽에 보관이 되는것이므로, 탈취가 되면 보안 문제가 발생하므로 HTTPS를 사용하거나 액세스 토큰, 리프레시 토큰을 사용하여 JWT의 보안성을 높일 수 있다.

 

7. Spring Data

데이터 액세스를 단순화하고 표준화하는 프로젝트 Spring JPA가 대표적이다. 

다양한 테이터 저장소에 대한 일관된 프로그래밍 모델을 제공,
기본적인 CRUD 작업을 자동으로 구현해주는 인터페이스 포함
메서드 이름만으로 쿼리를 자동생성하는 쿼리 메서드
페이징과 정렬을 쉽게 구현

주로 Repository에서 상속받아 사용한다.

 

 

이러한 내용을 바탕으로 파생될 수 있는 지식들을 알아두자.

 

 

 

Comments