<스프링을 이용한 간단한 회원가입 서비스 만들기>
본 포스팅은 스프링을 이용한 간단한 예제 프로젝트입니다.
지금까지의 포스팅에서 Service계층인 userService, Repository 계층인 userRepository 를 만들었다.
이제 컨트롤러를 만들어서 url 연결을 해주면 해당 기능을 사용할 수 있는데
한가지 문제점이 있다.
Controller에서 서비스를 사용해야하는데 어떻게 의존관계를 설정하는가에 대한 문제이다.
물론 new 키워드로 생성해서 넣어도 되지만
이렇게하면 다른곳에서도 userService를 사용할 경우 같은 객체를 불필요하게 여러번 생성하게 되고
그에 따른 부작용이 발생할 위험이 있다.
또, userService가 가진 의존관계를 또 일일히 세팅해줘야하는데
프로젝트 규모가 커지면 커질수록 여간 귀찮은 일이 아닐 수 없을 것이다.
때문에 여기서는 Spring이 제공해주는 스프링 컨테이너를 활용하는게 가장 효율적이다.
1. 스프링 컨테이너란?
스프링 컨테이너에 객체를 등록하면 해당 객체를 관리해주는데
이 때 등록된 객체를 빈 이라고 부른다.
이 빈으로 등록된 객체는 일반적으로 싱글톤으로 관리되며
(여러번 요청해도 한개까지만 생성되서 관리된다는 의미이다)
객체를 생성하면서 필요한 의존관계를 모두 스프링이 등록해서 주입해준다.
즉 이 스프링 컨테이너에 우리가 만든 userService, userRepository 클래스들을 등록해주면
스프링이 띄워질 때 알아서 등록된 빈들을 생성해서
의존관계들을 연결해 준다는 의미이다.
그렇다면 이 스프링 컨테이너에 우리가 만든 클래스들을 어떻게 빈으로 등록할까?
2. 빈 등록 방법
2-1. 컴포넌트 스캔 이용하기
기본적으로 스프링은 main메서드(정확히는 @SpringBootApplication 어노테이션이 붙은 클래스)가 있는 곳부터 하위 패키지들을 모두 스캔해서 @Component 가 붙은 클래스들을 모두 빈으로 등록해준다.
따라서 단순하게 보면 우리가 빈으로 등록하고자 하는 클래스들에 @Component를 붙이면 바로 빈 등록이 될 것이다.
하지만 Controller, Service, Repository와 같은 특수한 클래스들은 전용 어노테이션이 따로 있다.
아래와 같이 어노테이션을 추가해주면 된다.
1) Controller
@Controller
public class UserController {
}
2) Service
@Service
public class UserService {
}
3) Repository
@Repository
public class MemoryUserRepositoryImpl implements UserRepository {
}
이렇게 하면 각 계층들이 바로 빈으로 등록이 된다.
참고로 각 어노테이션들의 @Component에서 추가되는 부가적인 기능은 다음과 같다.
어노테이션 | 부가 기능 |
@Controller | url 매핑할 때 사용되는 @RequestMapping 어노테이션을 해당 어노테이션 밑에서만 사용할 수 있다. |
@Service | 다른 어노테이션과 다르게 @Component에 추가된 기능은 없다. 하지만 관례상 비즈니스 로직에는 해당 어노테이션을 사용하는 것이 좋다. |
@Repository | @Repository는 플랫폼 특정 exception을 잡아 Spring의 unchecked exception으로 뱉어내준다. |
이제 빈 등록은 완료되었으니 의존관계를 설정해주면 된다.
의존관계 등록은 아래와 같이 하면 된다.
(여기서는 대표적으로 userService 만 진행하도록 하겠다.)
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
이런 식으로 필요한 계층의 필드들을 받아오는 생성자를 만들어서 각 필드에 넣어준 뒤
생성자에 @Autowired 어노테이션을 달아주면 된다.
이렇게 하면 스프링이 띄워지면서 userService를 만들고 동시에 UserRepository 빈을 생성자를 통해 넣어주는 데
이런식으로 의존성을 주입하는 방식을 생성자 주입이라고 부른다.
2-2. 자바 코드로 직접 스프링 빈 등록하기
이번에는 어노테이션이 아닌 별도의 설정파일을 두어 코드로 빈을 등록해보자
(일반적으로 정형화된 Controller,Service와 같은 계층들은 컴포넌트스캔 방식의 어노테이션으로 하면 되고 특별히 관리해줘야 하는 빈들은 유지보수를 위해 주로 이 방식으로 등록을 한다)
일단 코드부터 보도록 하자.
@Configuration
public class SpringConfig {
@Bean
public UserService userService() {
return new UserService(userRepository());
}
@Bean
public UserRepository userRepository() {
return new MemoryUserRepositoryImpl();
}
}
먼저 @Configuration 어노테이션으로 해당 클래스가 설정파일 역할을 할 것임을 스프링에게 알린다.
이후 생성할 빈을 리턴값으로 하는 메서드들을 만들고 위에 @Bean어노테이션을 붙이면
해당 클래스가 빈으로 등록이 된다.
Reference
이 포스팅은 아래의 강좌를 참고하여 만들어졌습니다.
- 스프링 핵심 원리-기본편
'Backend > 게시판만들기' 카테고리의 다른 글
[Spring실습]5분만에 알아보는 회원관리 웹 만들기-5 (0) | 2020.11.30 |
---|---|
[Spring실습] 5분만에 알아보는 회원가입 서비스 만들기-3 (0) | 2020.11.30 |
[Spring실습] 5분만에 알아보는 테스트 케이스 작성해보기-2 (0) | 2020.11.29 |
[Spring실습] 5분만에 알아보는 프로젝트 설계 예제 및 회원 도메인과 리포지토리 만들기-1 (0) | 2020.11.24 |
[SpringBoot]게시판 로그인 기능 제작 및 예제(Form데이터 Controller에서 받아서 처리하기) (2) | 2020.08.16 |