스프링 Annotation(어노테이션) 정리

취업 후 학습|2023. 6. 28. 16:01
728x90

업무를 하면서 다양하고 많은 Annotation에 대한 이해가 부족해 정리하고자 작성하기로 했다.

 

Lombok Annotation


@Setter

Class의 모든 필드에 해당하는 Setter 메서드 생성

 

@Getter

Class의 모든 필드에 해당하는 Getter 메서드 생성

 

@ToString

Class의 모든 필드에 해당하는 ToString 메서드 생성

 

@NoArgsConstructor

Class의 기본 생성자 추가

 

@RequiredArgsConstructor

Final이나 @NonNull인 필드만 파라미터로 받는 생성자 추가

 

@AllArgsConstructor

Class의 모든 필드 값을 파라미터로 받는 생성자 추가

 

@EqualsAndHashCode

Equals와 HashCode 메서드를 오버라이딩 하는 어노테이션

 

@Data

@Setter, @Getter, @ToString, @NoArgsConstructor 등 Lombok에서 제공하는 필드와 관련된 모든 코드 추가 (모든 기능 사용 가능하므로 Risk 존재해서 사용하지 않는 게 좋음)

 

JPA Annotation


@Entity

실제 DB 테이블과 매핑될 Class

 

@Table(name = "")

실제 DB의 name에 해당하는 테이블과 매핑(생략할 경우 Class명과 테이블명 매핑)

 

@Id

해당 테이블의 PK 필드

 

@Column(name = "")

name에 해당하는 컬럼과 매핑(생략할 경우 필드명과 컬럼명 매핑)

 

Spring Annotation 


@Controller

해당 Class는 Controller란 것을 명시하고 Spring에서 Bean으로 등록 (Bean이란 Spring에서 관리하는 자바 객체)

 

@Service

해당 Class는 비즈니스 로직을 수행하는 Service란 것을 명시하고 Spring에서 Bean으로 등록

 

@Repository

해당 Class는 DAO인 것을 명시하고 Spring에서 Bean으로 등록 (Spring에서 지원하지 않는 Exception을 Spring Exception으로 전환)

 

@Component

해당 Class는 Component란 것을 명시하고 Spring에서 Bean으로 등록 (@Controller, @Service, @Repository의 상위 어노테이션이므로 3가지 전부 @Component으로 대체 가능)

 

@Bean

개발자가 제어 불가능한 외부 라이브러리 등을 Bean으로 등록

 

@ComponentScan

@Component, @Controller, @Service, @Repository 가 부여된 Class 들을 검색해서 Bean으로 등록

 

@RequestMapping(value = "")

URI의 요청이 value와 일치할 경우 해당 클래스나 메서드 실행

 

@RequestParam(value = "", required = false)

메서드 파라미터 앞에 쓰며 Http 요청의 파라미터 값(value)을 메서드 파라미터로 받음

required 옵션의 Default는 true이며 true일 경우 해당 파라미터가 없을 때 400 에러 발생

 

@RequestBody

메서드 파라미터 앞에 쓰며 Http 요청의 Body를 자바 객체로 변환해서 매핑된 메서드 파라미터로 전달

 

@RequestHeader(value = "")

메서드 파라미터 앞에 쓰며 Request의 Header값을 메서드의 파라미터로 받는 어노테이션

 

@ResponseBody

자바 객체를 Http 요청의 Body로 변환(content-type을 application/json으로 설정 필요)

 

@RestController

@Controller와 @ResponseBody를 합친 어노테이션

 

@ModelAttribute

View단에서 전달하는 파라미터를 메서드의 파라미터로 변환해 주는 어노테이션(태그의 name과 클래스의 멤버 변수명, Set 메서드명 일치)

 

@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping

각 Get, Post, Put, Delete, Patch 요청에 대한 Annotation

 

@Valid

파라미터 객체 앞에 쓰며 유효한 객체인지 검사

 

@CookieValue(value = "", required = false)

쿠키의 value 값을 받아오며 required의 Default는 true

required = false를 사용하지 않은 상태에서 해당 쿠키값이 존재하지 않다면 500 에러를 발생시키고 사용하면 존재하지 않을 때 null로 받음

 

@Lazy

Class가 실제 사용될 때 Spring에서 Bean등록을 하게 되는 지연 로딩

 

@Autowired

Field, Setter, Constructor 3가지에 사용하며 Type에 따라 Bean을 주입

 

@Qualifier("id")

@Autowired와 같이 쓰며 같은 타입의 Bean 객체가 있을 경우 명시된 ID로 원하는 Bean을 주입하는 어노테이션

 

@PathVariable

메서드 파라미터 앞에 쓰며 URI에서 특정 값을 메서드 파라미터로 받아오는 어노테이션

특정 값은 URI에서 {}로 감싸고 파라미터 명과 같음

 

@Transactional

메서드 내부의 DB 트랜잭션 설정하는 어노테이션

 

@Scheduled(cron = "")

Cron 표현식에 의한 정해진 시간에 메서드를 실행시키는 어노테이션

 

@Test

Junit에서 테스트할 대상으로 지정

728x90

댓글()

스프링이란? 스프링과 스프링 부트의 차이점은?

취업 후 학습|2023. 6. 20. 14:26
728x90

이미 Spring Boot를 이용한 웹 업무를 하고 있지만 유지보수 수준이기 때문에 구체적인 이해가 부족한 듯싶어 처음부터 정리할 겸 작성하기로 했다.

 

Spring 이란?


Spring은 Java 개발을 편하게 해주는 프레임워크이며 웹 MVC 모듈을 제공하여 동적인 웹을 효과적으로 제작할 수 있다.

 

또한 ORM(JPA, Mybatis)과 같은 모듈들을 보다 편하게 사용할 수 있다는 장점이 있다.

 

이때 ORM은 Object Relational Mapping의 약자로 객체와 관계형 데이터 베이스의 데이터를 자동으로 Mapping 해주는 것을 뜻한다.

 

추가적으로 https://start.spring.io/ 해당 사이트에서 초기 프로젝트를 생성하는 서비스를 제공하기도 한다.

 

Spring은 자바 객체의 생명 주기를 관리하기 때문에 사용자는 컨테이너에서 필요한 객체를 가져와 사용만 하면 된다는 편리함이 있으며 대표적인 특징으로는 DI, IOC가 있다. 

 

DI는 Dependency Injection(의존성 주입)의 약자로 어떤 객체를 사용하는 주체가 객체를 직접 생성하는 것이 아니라 Spring에서 생성한 객체를 주체에게 주입시켜 주는 방식을 뜻한다.

 

객체를 직접 생성하게 되면 수정 사항이 생길 때마다 수정할 부분이 많아지는데(의존성이 높아지는데) Spring에서 생성하게 되면 Interface를 기반으로 관리하기 때문에 수정할 부분이 줄어든다(의존성이 낮아진다).

 

이때 Interface를 사용하는 이유는 Controller 단에서 직접 Service를 바라보는 게 아닌 Interface를 바라보고 있는데 Interface에 대한 실제 구현체가 Service단에 있으므로 Runtime 직전까지는 실제 구현체를 알지 못한다.

 

따라서  Controller 단에서는 실제 비즈니스 로직에 대해 알 필요가 없고 Interface의 메서드로만 로직을 구성하면 된다.

 

반대로 Service 단에서는 Interface의 규칙만 잘 지킨다면 언제든 로직 변경이 가능하고 새로운 클래스로 대체도 가능하기 때문에 의존성이 낮아져 확장성이 높다는 장점이 있다.

 

IOC는 Inversion Of Control(제어의 역전)의 약자로 간단하게 말하자면 사용자의 제어권을 Spring에게 넘기는 것을 뜻한다.

 

일반적인 Java Programming의 흐름은 사용자가 직접 객체를 생성하고 메서드를 호출하는 방식이었지만 Spring에서는 Spring이 객체를 생성하고 주입하여 객체의 메서드를 호출하는 방식이다.

 

따라서 Spring이 실행될 때 모든 의존성 객체를 생성하고 필요한 곳에 주입해 준다.

 

Spring과 Spring Boot의 차이점


결론부터 말하자면 Spring Boot는 Spring의 복잡성을 줄인 업그레이드 버전이라고 생각하면 된다.

 

Spring은 Dependency 설정을 위해 https://mvnrepository.com/ 같은 곳에서 일일이 찾아야 하고 버전 관리도 직접 해야 해서 번거롭고 복잡하지만 Spring Boot는 spring-boot-starter를 통해 자동으로 설정할 수 있어 훨씬 더 짧은 시간에 비교적 간단하게 실행할 수 있다.

 

또한 Spring은 주로 maven 기반의 Java Application을 만드는 데 사용하지만 Spring Boot는 Gradle 기반의 REST API 개발에 사용하며 톰캣 같은 WAS가 내장되어 있어 쉽게 Web Application 구동이 가능하며 실행 가능한 JAR 파일 생성도 가능하여 자바 옵션만으로 쉽게 배포가 가능하다.

 

정리하자면 Spring은 프레임워크를 보다 세밀하게 제어하는 경우, Spring Boot는 빠르게 간단하게 Application 개발을 하는 경우에 적합하다.

 

 

728x90

댓글()