[Spring] 스테레오타입 어노테이션 (Stereotype Annotation)

이광훈·2023년 6월 22일
0

✅ IOC 컨테이너(스프링 컨테이너)

👉 객체나 메소드의 생성주기(프로그램의 흐름)를 컨테이너가 관리 → 제어의 역전

💡 IoC Container의 관리를 받는 객체를 Bean 객체라고 함

🌐 @Component

  • 개발자가 생성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation
  • @Component는 다른 스테레오 타입 어노테이션들의 상위 개념으로 사용됨
    » @Service, @Repository, @Controller 등의 어노테이션들은 @Component를 기반으로 함
import org.springframework.stereotype.Component;

@Component // 평범한 bean 객체 (스프링한테 bean 객체라고 알려줌) IOC 등록하고 싶은 객체
public class AppComponent {}

🌐 @Repository

  • 데이터베이스와 직접적으로 소통하는 요소를 지칭하는 어노테이션
  • 데이터베이스에 접근하는 method를 가지고 있는 Class에서 사용
@Repository
public class AppRepository {
    //데이터베이스와 소통을 담당
    public List<Object> selectStudentAll(){
        return new ArrayList<>();
    }
}

🌐 @Service

  • 비지니스 로직을 수행하는 Class라는 것을 나타내는 용도
  • 다양한 컴포넌트의 기능을 활용하고, 데이터베이스의 조회 기록을 활용해서 실제로 서비스가 무슨 일을 하는지 나타내기 위한 용도
  • 주로 Controller에서 입력을 받고 Repository한테 로직을 수행해달라고 요청
    → Repository에 의존성을 주입
  • Repository가 데이터베이스에서 데이터를 받아오면 Service 클래스에서 로직을 수행하고 다시 Controller에게 전달 → Controller는 사용자 요청에 대한 응답
@Service
public class AppService {
    // 주된 비즈니스 로직이 구현되는 공간
    // Controller -> Service
    // 1. 데이터베이스 조회
    // 2. Component 사용
    // 3. 모은 데이터를 가지고 응답 (의사결정)
    
    private final AppRepository repository; //Service는 보통 repository와 소통

    public AppService(AppRepository repository) {
        this.repository = repository;
    }

    public List<Object> readStudentAll(){
        List<Object> queryResult = repository.selectStudentAll();

        return queryResult;
    }
}

🌐 @Service

  • 사용자 입력을 처리하기 위한 부분을 명시
  • Controller가 Service에 대한 의존성을 생성자를 통해 주입받음
  • @Controller
    • API와 view를 동시에 사용하는 경우에 사용
    • API 서비스로 사용하는 경우에는 @ResponseBody를 사용하여 객체를 반환
    • view(화면) return이 주목적
  • @RestController
    • view가 필요없는 API만 지원하는 서비스에서 사용
    • 모든 메소드에 @ResponseBody를 붙이는 용도
    • data(json, xml 등) return이 주목적
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
// 모든 메소드에 @ResponseBody를 붙이는 용도
public class AppController {
	// 사용자의 입력을 받는 요소
    private final AppService service;
    
    public AppController(AppService service) {
    	this.service = service;
    }
    
    @GetMapping("create")
    public @ResponseBody String create() {
    	this.service.createStudent(
        		"sanghun",
                33,
                "010-1234-5678",
                "bdns@gmail.com"
       	);
        
        return "done";
   	};
    
    @GetMapping("read-all")
    public @ResponseBody String readAll() {
        this.service.readStudentAll();
        return "done-read-all";
    }

    @GetMapping("read")
    public @ResponseBody String readOne() {
        this.service.readStudent(1L);
        return "done-read-one";
    }

    @GetMapping("update")
    public @ResponseBody String update(){
        this.service.updateStudent(1L,"panghun");
        return "done-update";
    }

    @GetMapping("find")
    public @ResponseBody String find(){
        this.service.findAllByTest();
        return "done-find";
    }
}

🌐 @Configuration

  • 프로젝트 내부에서 활용하기 위한 설정들을 담고있다는 의미
import org.springframework.context.annotation.Configuration;

@Configuration //Spring을 활용하는데 필요한 다양한 설정을 담고있음
public class AppConfiguration {

}

🌐 Bean

  • Class 위에는 @Configuration을 붙여줘야함
  • Configuration 내부에서 정의한 메소드의 결과만 따로 Bean 객체로서 관리
@Configuration
public class AppConfig {
    @Bean
    public AppConfigData connectionUrl(){
        if (/* 통신이 정상적으로 이뤄지는지 확인 */)
            return new AppConfigData("main-url");
        else return new AppConfigData("backup-url");
    }
}

💡 @Component와 @Bean의 차이

@Bean@Component
메소드에 사용클래스에 사용
개발자가 컨트롤이 불가능한 외부 라이브러리 사용 시 사용개발자가 직접 컨트롤이 가능한 내부 클래스에 사용
profile
웃으며 일할 때, 시너지가 배가 된다고 믿는 개발자

1개의 댓글

comment-user-thumbnail
2025년 2월 27일

두번째 @Service가 @Controler 아닌가요?

답글 달기