어노테이션(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가지 방법이 있다.
- 생성자 주입
- Setter 주입
- 필드 주입
필드 주입
@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)와의 통합을 지원
- 자바 객체와 관계형 데이터베이스 간 매핑을 쉽게 처리
'개발' 카테고리의 다른 글
[React.js, 스프링부트, AWS로 배우는 웹 개발] 2장 - 의존성 주입 (0) | 2024.07.18 |
---|---|
[React.js, 스프링부트, AWS로 배우는 웹 개발] 1장 - HTTP 메서드 (0) | 2024.07.16 |
람다(lambda) (1) | 2023.11.26 |
라이브러리(deque) (1) | 2023.11.26 |
문자열 (1) | 2023.11.26 |