개발

[React.js, 스프링부트, AWS로 배우는 웹 개발] 1장 - 어노테이션

jih0ssang 2024. 7. 16. 21:19

어노테이션(Annotation)

  • Java 코드에 메타데이터를 추가하는 특별한 형식의 주석
  • 특정 동작을 수행하기 위해 사용
  • 빈 정의, 의존성 주입 등에 사용
    @Component : 클래스가 빈으로 등록됨
    @Autowired: 의존성 주입을 자동으로 처리
    @Service : 서비스 계층에 사용되는 빈
    @Repository: 데이터 접근 계층에 사용되는 빈
    @Controlloer: 웹 계층에 사용되는 빈
계층 서비스 계층 데이터 계층 웹 계층
목적 비즈니스 로직 처리 데이터베이스와 상호작용 프론트. 컨트롤러와 뷰로 구성

 

 

XML 설정 (XML Configuration)

<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="fileTodoPersistence" class="com.example.FileTodoPersistence" />
    <bean id="todoService" class="com.example.TodoService">
        <constructor-arg ref="fileTodoPersistence" />
    </bean>
</beans>
  • 애플리케이션의 설정 정보
  • Spring 컨테이너가 관리할 빈을 XML 파일에 설정   ( ex_  <bean id="fileTodoPersistence" />)

 

@SpringBootApplication

@SpringBootApplication
public class DemoApplication {
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}
  • 해당 클래스가 스프링 부트를 설정하는 클래스
  • 베이스 패키지로 간주

스프링은 베이스 패키지와 그 하위 패키지에서 자바 빈을 찾아 스프링의 의존성 주입 컨테이너 오브젝트, 즉 ApplicationContext에 등록한다.

그리고 애플리케이션 실행 중 어떤 오브젝트가 필요한 경우 의존하는 다른 오브젝트를 찾아 연결해 준다.

 

자동으로 다른 오브젝트를 찾아 연결해 주는 것은 @Autowired라는 어노테이션이 한다.

 

 

빈( @Bean )

[@Bean 어노테이션을 이용한 스프링 빈 등록]

@Configuration
public class ConfigClass {

  @Bean
  public Controller getController() {
    if(env == 'local') {
      return new LocalController(...);
    }
    
    return new Controller(...);
  }
}
  • 스프링에게 직접적으로 "이 빈은 이렇게 생성해라" 생성하는 방식과 매개변수 등을 알려주는 어노테이션
  • 엔터프라이즈 애플리케이션은 @Autowired를 사용안하는 경향이 있거나 자동 연결되는 빈이 아닌 다른 빈이거나 추가할 라이브러리가 스프링 기반이 아닐 경우 스프링에게 직접 빈을 생성하도록 알려주는 어노테이션

 

@Component

  • 스프링에게 이 클래스를 자바 빈으로 등록시키라고 알려주는 어노테이션
  • 다양한 스테레오 타입(@Controller, @Service, @Repository) 모두 @Component가 달려있음

[@Service의 내부]

@Component
public @interface Service {
...
}
  • 위에 어노테이션 @Service의 내부도 @Component 어노테이션이 붙어있음
  • 스프링이 검색해서 오브젝트로 등록하려면 원래는 @Component를 클래스에 달기만 하는 것 뿐 아니라, @ComponentScan 어노테이션이 클래스에 있어야 함. 하지만 그러지 않아도 되는 이유는 아래에서 설명하겠음

[@SpringBootApplication의 내부]

@ComponentScan
public @interface SpringBootApplication {
...
}
  • @ComponentScan을 프로젝트 내부에서 사용하진 않았지만 DemoApplication 클래스의 @SpringBootApplication이 이미 @ComponentScan 을 포함하고 있어서 굳이 추가하지 않아도 되는 것이었음

 

 

 

@AutoWired

  • 의존성 주입(DI)

 

의존성 주입하는 방법에는 다음과 같이 3가지 방법이 있다.

  1. 생성자 주입
  2. Setter 주입
  3. 필드 주입

필드 주입

@Service
public class MyService {
    @Autowired
    private MyDependency dependency;

}

생성자나 Setter를 이용하지 않고 객체에 바로 의존성 주입

 

 

@Builder

  • 오브젝트 생성을 위한 디자인 패턴 중 하나
  • @Builder 어노테이션을 사용하면 Builder 클래스를 따로 개발하지 않고도 Builder 패턴을 사용해 오브젝트를 생성할 수 있다.

[Lombok이 생성하는 Builder 메서드]

 

TodoEntity todo = TodoEntity.builder()
                    .id("t-10328373")
                    .userId("developer")
                    .title("Implement Model")
                    .build();
  • Builder 패턴을 사용하는 것은 생성자를 이용해 오브젝트를 생성하는 것과 비슷하다.
  • 장점은 생성자 매개변수의 순서를 기억할 필요가 없다.

 

 

@NoArgsConstructor

  • 매개변수가 없는 생성자를 구현한다.
  • 아래와 같이 생성자를 구현하는 것과 같다.

[Lobmok이 생성하는 NoArgsConstructor]

public TodoEntity() {

}

 

 

 

@AllArgsConstructor

  • 클래스의 모든 멤버 변수를 매개변수로 받는 생성자를 구현해준다. 

[Lobmok이 생성하는 AllArgsConstructor]

public TodoEntity(String id, String userId, String title, boolean done) {
  super();
  this.id = id;
  this.userId - userId;
  this title = title;
  this.done = done;
}

 

 

@Data

  • 클래스 멤버 변수의 Getter/Setter 메서드를 구현해준다.

[Lobmok이 생성하는 Getter/Setter]

public String getId(){
    return id;
}
   
public void setId(String id){
    this.id=id;
}

public String getUserId(){
    return userId;
}
   
public void setUserId(String userId){
    this.userId=userId;
}

 

 

 

@RestController

@RestController  
@RequestMapping("/api/v1")
public class HelloController {

  @GetMapping(value = "healthcheck") // path 설정, GET 메서드 사용
  public String process(@RequestParam String name) {
    // 비즈니스 로직
    return "test" + name;
  }
}
  • HttpServlet 상속 받는 것을 대신해 사용한 어노테이션
  • 웹에서 들어온 HTTP 요청을 어떤 비즈니스 로직으로 보낼 지 결정
  • @Controller + @ResponseBody 합친 것

@RequestMapping

  • ex_ @RequestMapping("/api/v1")
  • /api/v1으로 들어오는 요청만 받는 클래스로 경로를 한정할 수 있음

@GetMapping

  • ex_ @GetMapping(value = "healthcheck")

@PostMapping , @PutMapping, @DeleteMapping, @PatchMapping

  • 각 메서드에 대한 요청을 작성할 때 사용하는 어노테이션

 

 

 


 

 

스프링

  • 오픈 소스의 경량 프레임워크

경량

  • 해당 프레임워크 사용 시, 메모리나 CPU 자원이 많이 들지 않거나 사용이 쉽고 간편한 경우

 

AOP(Aspec-Oriented Programming)

 

  • 관점 지향 프로그래밍
  • 애플리케이션의 비즈니스 로직과 별개로 공통 적용되는 기능(ex_로깅)을 모듈화하는 데 사용

 

ORM(Object-Relational Mapping)

  • ORM 프레임워크(JPA)와의 통합을 지원
  • 자바 객체와 관계형 데이터베이스 간 매핑을 쉽게 처리