인프런 올인원 자바 스프링 강의를 학습 목적으로 정리하여 포스팅합니다.
section3. 역할의 분리와 스프링 컨테이너
17강 ~ 22강 내용
1. 좋은 코드(clean code)의 중요성
코드는 요구사항을 표현하는 언어이다.
개발자는 요구사항을 구현하기 위해 기존 코드를 읽고 작성한다.
코드를 읽는 것은 필수적이고 피할 수 없다.
안 좋은 코드가 쌓이면, 시간이 지날 수록 생산성이 낮아진다.
<Clean Code 책 내용 중 일부>
1. 함수는 최대한 작게 만들고 한 가지 일만 수행하는 것이 좋다.
2. 클래스는 작아야 하며 하나의 책임만을 가져야 한다.
ㅡ> controller에서 모든 기능을 구현하는 것이 좋지 않다.
2. Controller를 3단 분리하기 - Service와 Repository
- Controller : API와 HTTP 담당
- Service : 분기 처리와 로직 담당
- Repository : DB 접근 담당
3. UserController와 스프링 컨테이너
@RestController를 붙여주면 UserController 클래스를 스프링빈으로 등록시킨다.
서버가 시작되면, 스프링 서버 내부에 거대한 컨테이너를 만들게 된다.
컨테이너 안에는 여러 클래스가 들어가게 된다.
이때 다양한 정보도 함께 들어가고, 인스턴스화도 이루어진다.
* 스프링 컨테이너 = 거대한 컨테이너
필요한 스프링 빈끼리 연결시켜준다.
* 스프링 빈 = 컨테이너 안에 들어간 여러 클래스
JdbcTemplate은 Dependency로 스프링 빈 등록이 되어 있다.
서버가 시작되면 일어나는 일의 순서
1. 스프링 컨테이너 ( 클래스 저장소)가 시작된다.
2. 기본적으로 많은 스프링 빈들이 등록된다.
3. 우리가 설정해준 스프링 빈들이 등록된다. ex) @Restcontroller, @Service 등
4. 이때 필요한 의존성이 자동으로 이뤄진다.
4. 스프링 컨테이너를 사용하는 이유
예를 들어 데이터를 메모리에 저장하는 코드와 MySQL에 저장하는 코드가 있는 상황에서
상황에 따라 둘 중 하나만 선택해서 사용하고 싶을 때
여러 개의 파일을 하나하나 수정할 필요없이
스프링 컨테이너가 둘 중 하나를 선택한다.
이를 제어의 역전 (IoC, Inversion of Control) 이라 한다.
또한 컨테이너가 둘 중 하나를 선택해서 넣어주는 과정을 의존성 주입 (DI, Dependency Injection) 이라 한다.
@Primary 어노테이션을 활용하여 선택지에 우선권을 제어할 수 있다.
5. 스프링 컨테이너를 다루는 방법
빈을 등록하는 방법
@Configuration
- 클래스에 붙이는 어노테이션
- @Bean을 사용할 때 함께 사용해 주어야 한다.
@Bean
- 메소드에 붙이는 어노테이션
- 메소드에서 반환되는 객체를 스프링 빈에 등록한다.
위 두 조합은 외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때 사용한다.
@Service, @Repository
- 개발자가 직접 만든 클래스를 스프링 빈으로 등록할 때 사용한다.
@Component
- 주어진 클래스를 '컴포넌트'로 간주한다.
- 이 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다.
- @Service, @Repository, @Restcontroller에는 @Component가 들어있다.
- 컨트롤러, 서비스, 리포지토리가 모두 아니고
개발자가 직접 작성한 클래스를 스프링 빈으로 등록할 때 사용되기도 한다.
스프링 빈을 받는 방법
- 생성자를 이용해 주입받는 방식 (가장 권장)
- setter와 @Autowired 사용 : 누군가 setter를 사용하면 오작동할 수 있다.
- 필드에 직접 @Autowired 사용 : 테스트를 어렵게 만드는 요인이 된다.
@Qualifier
- @Primary 어노테이션이 없는 상황에서 빈을 받는 쪽에서 특정 빈을 선택할 수 있게 해준다.
- 받는 쪽과 주는 쪽 둘 다 @Qualifier("특정이름")을 적어주면 서로 연결된다.
- 둘 다 사용하고 있을 경우 @Qualifier가 우선순위가 더 높다.
'JAVA > [인프런] 스프링 강의들' 카테고리의 다른 글
[ 서버 개발 올인원 패키지] 5. 책 요구사항 구현하기 (0) | 2023.02.26 |
---|---|
[ 서버 개발 올인원 패키지] 4. 생애 최초 JPA 사용하기 (0) | 2023.02.24 |
[ 서버 개발 올인원 패키지] 2. 생애 최초 Database 조작하기 (0) | 2023.02.22 |
[ 서버 개발 올인원 패키지] 1. 생애 최초 API 만들기 (0) | 2023.02.19 |
[서버 개발 올인원 패키지] 0. 자바를 공부하기 전 알아두면 좋을 것들 (0) | 2023.02.18 |