들어가며
- Controller 는 말 그대로 프로젝트를 컨트롤 하는 역할이다.
- 무슨 말인가 하면 Contoller 가 Service, Repository 등을 사용해 기능을 수행 한다.
- 이 때 자바를 배운 사람이라면 Service 를 사용 하기 위해서 new 를 통해 class 를 생성하고 사용 할 것이다.
- 하지만 이렇게 한다면 A_Controller 와 B_Controller 에서 같은 Service 를 사용할 때 서로 다른 객체를 사용 하게 된다.
- 위 상황에서는 A 와 B 가 같은 객체를 사용 하도록 해 주는 것이 더 명확한 프로젝트가 된다.
Bean
- 등록된 class 들을 spring 이 실행 될 때 spring container 에 미리 넣을 수 있게 설정 하는 것이라 보면 된다.
- 이때 class 는 기본적으로 하나만 등록 되며 이에 따라 여러 곳에서 해당 class 를 불러다 사용해도 모두 같은 객체를 사용 할 수 있다.
- Bean 의 등록 방법에는 크게 2가지가 있다.
. Component Scan 을 이용한 자동 의존관계 설정
. 자바 코드로 직접 Spring Bean 등록
Component Scan 을 이용한 방법
- Spring 에는 "@Controller, @Repository, @Service" 라는 Annotation 이 존재 한다.
- 이들은 각각 controller, repository, service class 바로 위에 달리며 해당 Annotation 이 달리게 되면 spring 이 자동으로 해당 class 를 Bean 에 등록 하게 된다.
- 이후 사용 할 때 "@AutoWired" 를 사용하면 된다.
- 예시를 통해 방법을 알아 보면
. Repository 구현체
- Repository 위에 "@Repository" 를 붙여 Scan 을 통해 자동으로 등록 되도록 해 준다.
package com.example.springlearn.repository;
import java.util.*;
import com.example.springlearn.domain.Member;
import org.springframework.stereotype.Repository;
@Repository
public class MemoryMemberRepository implements MemberRepository {
//...
}
. Service class
- 위와 동일 하게 "@Service" 를 위에 붙여 준다.
- Sevice 는 Repository 를 사용하기 때문에 이를 연결 해 주어야 한다.
- 이럴 때 사용 하는 것이 "@Autowired" 이다.
- 사용 하게 되면 spring container 에 있는 객체를 가져와서 자동을 연결 해 준다.
package com.example.springlearn.service;
import com.example.springlearn.domain.Member;
import com.example.springlearn.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
//...
}
. Controller
- 이렇게 하면 일단 Service 를 사용하기 위한 준비는 끝이 났다
- 동일하게 @Autowired 를 사용 하여 자동으로 연결을 해 준다.
package com.example.springlearn.controller;
import com.example.springlearn.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
}
자바 코드로 직접 Spring Bean 등록
- 자동으로 Bean 등록 하지 않고 수동으로 등록 하는 방법도 있다. @Bean 이라고 붙이기만 하면 된다.
- 예시를 통해 방법을 알아 보겠다.
- 우선 SpringConfig 파일을 생성 한다.
- 그 후 아래 코드처럼 Bean 에 등록 해야 할 MemeberService, MemberRepository 를 넣어 준다.
- 이 때 memberService 는 생성자가 memberRepository를 받게 만들어 두었었기 때문에 아래 처럼 Repository 를 넣어 주면 된다.
package com.example.springlearn;
import com.example.springlearn.repository.MemberRepository;
import com.example.springlearn.repository.MemoryMemberRepository;
import com.example.springlearn.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
마무리
- Spring 이 실행 될 때 DI(Dependency Ingection) 하는 방법은 3가지 정도로 볼 수 있다.
. 생성자 주입 방식 : class 의 생성자에 파라미터로 넘겨 주입
. 필드 주입 방식 : 필드에서 바로 주입 하는 방식
. setter 주입 방식 : setter 를 통해 세팅 하는 방식
- 필드는 위험하고, setter 는 public 으로 해야 하니 중간에 꼬이면 바뀔 위험이 있다.
- 따라서 요즘은 생성자 방식으로 한다고 한다.(아래 처럼 생성자가 외부 객체를 받아 필드의 변수에 넣어 주는 방법)
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
}
'백앤드 > SpringBoot + Java 간간한 백앤드 예제' 카테고리의 다른 글
[SpringBoot + Java] 간단한 백엔드(MySql + Spring 설정) (0) | 2023.07.20 |
---|---|
[SpringBoot + Java] 간단한 백엔드(MySql) (0) | 2023.07.20 |
[SpringBoot + Java] 간단한 백엔드(test code) (1) | 2023.07.16 |
[SpringBoot + Java] 간단한 백엔드(domain, repository, service) (0) | 2023.07.16 |
[SpringBoot + Java] 스프링 웹(Static, MVC, API) (0) | 2023.07.11 |