스프링 부트를 이전에 찍먹 해본거 말고는 해본적이 없어서 어노테이션을 사용하면서도 무슨 기능인지 왜 쓰는지 조금 알기어려웠다.. 그래서 한번 정리하면서 좀 익혀보려한다. 또, lombok을 사용했는데 해당 기능의 어노테이션도 정리해봐야 할 것 같다.
Spring boot
1. Spring
@Annotation | @기능 |
@RestController | - 컨트롤러를 JSON으로 반환하도록 만듦 - 예전에는 @ResponseBody를 각 메소드마다 선언했던 것을 한번에 함 |
@GetMapping("/") @PostMapping("/") @PutMapping("/") @DelteteMapping("/") |
- HTTP Method 중 각 Get, Post, Put, Delete 요청을 받을 수 있는 API로 만듦 - 예전에는 RequestMapping(method = RequestMethod.GET) 으로 사용했음 |
@RequestParam("name") | - 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션 - 여기서는 외부에서 name 이란 이름으로 넘긴 파라미터를 저장할 때 사용 |
@Autowired | - 스프링이 관리하는 빈(Bean)을 주입 |
@Service | - 비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도 |
@Transactional | - DB 트랙잭션을 설정하고 싶은 method에 적용하면 정상적으로 모두 처리됬을때 커밋을 하거나 하나라도 실패하면 다시 롤백하게 해주는 어노테이션 |
@Component | - Spring에 이 클래스가 컴포넌트 클래스라고 선언 - Bean과 비슷하나 개발자가 직접 만든 클래스를 선언할 때 사용 |
@Configuration | - 빈 설정을 담당하는 클래스가 됨 - 한 개 이상의 @Bean을 제공하는 클래스에 명시하는 어노테이션으로, IOC Container에게 해당 클래스가 Bean으로 구성돈 클래스라는 것을 알려줌 |
2. JPA
@Annotation | @기능 |
@Entity | - 테이블과 링크될 클래스임을 명시 - 기본으로 클래스의 카멜케이스 이름을 언더스코어 네이밍으로 테이블 이름 매칭 - ex) SalesManager.java -> sales_manager table |
@Id | - 해당 테이블의 PK 필드를 선언 |
@GeneratedValue(strategy = GenerationType.IDENTITY) |
- PK 생성 규칙을 나타냄 - 스프링 부트 2.0 에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment로 설정 가능 |
@Column (length = 500, nullable = false), (columnDefinition = "TEXT", nullable = false) ... |
- 테이블 칼럼을 굳이 선언하지 않아도 해당 클래스의 필드는 모두 칼럼이 됨. - 사용하는 이유는 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용 - ex) 문자열의 경우 VARCHAR(255)가 기본값인데, 사이즈를 500으로 증가하고 싶거나, 타입을 TEXT로 변경하고 싶은 경우 등에 사용 |
@Repository | - DTO 클래스에서 사용 - DB에 접근하는 method를 가진 클래스에 명시 |
@MappedSuperclass | - JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 필드들(createDate, modifiedDate)도 컬럼을 인식하도록 명시 - 상속받은 자식이 부모의 변수도 컬럼으로 인식할 때 사용하는거 같음 |
@EntityListeners(AuditingEntityListener.class) | - 해당 클래스에 Auditing 기능을 포함 시킴 - Audtiting : 감시하는 기능으로 트랜잭션 커밋 시점에 하이버네이트가 자동으로 시간 값을 채움 |
@CreatedDate | - Entity가 생성되어 저장될 때 시간이 자동 저장 |
@LastModifiedDate | - 조회한 Entity의 값을 변경할 때 시간이 자동 저장 |
@Enumerated(EnumType.STRING) | - JPA로 DB에 저장할 때 Enum 값을 어떤 형태로 저장할지를 결정함 - 기본적으로는 int로 된 숫자가 저장 - 숫자로 저장되면 그 값으 무슨 코드를 의미하는지 알기 어려움 - 왼쪽은 그래서 문자열로 변경했음 |
@EnableJPAAuditing | - JPAAuditing 기능 활성화 |
3. Config (auth, config, java)
@Annotation | @기능 |
@EnableWebSecurity | - Spring Security 설정들을 활성화 시킴 |
@Target(ElementType.PARAMETER) | - 어노테이션을 만들때 사용 - 어노테이션이 생성될 수 있는 위치를 지정 - PARAMETER로 지정했으니, 메소드의 파라미터로 선언된 객체에서 사용 |
@interface | - 이 파일을 어노테이션 클래스로 지정 - ex) LoginUser라는 이름을 가진 어노테이션이 생성 |
4. Test
@Annotation | @기능 |
@Runwith(SpringRunner.class) -> @ExtendWith(SpringExtension.class) |
- 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행 - ()안에 있는 스프링 실행자를 사용하여 실행 - 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 함 |
@WebMvcTest(controllers = HelloContrlloer.class) excludeFilters = { @componentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = SecurityConfig.class } |
- 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션 - 선언할 경우 @Controller, @ControllerAdvice 등을 사용가능 - 단, @Service, @Component, @Repository는 사용 불가 - 컨트롤러만 사용할 때 선언 excludeFilters - WebMvcTest는 WebSecurityConfigurerAdapter, WebMvcConfigurer를 비롯한 @ControllerAdvice, @Controller를 읽음. 즉, @Repository, @Service, @Component는 스캔 대상이 아님. - SecurityConfig.class안에는 Service인 CustomOAuth2UserService.class라는 클래스가 사용. Service는 스캔을 하지 않으니 SecurityConfig.class를 생성하면서 오류 발생. 따라서 SecurityConfig.class를 사용하지 않도록 제외 |
@After | - Junit에서 단위 테스트가 끝날 때마다 수행되는 메소드 - 보통 배포 전 전체 테스트 수행시 테스트간 데이터 침범을 막기위해 사용 - 여러 테스트를 동시에 사용하면 테스트용 DB인 h2에 데이터가 남아 오류 발생 |
@Test | - 테스트를 만드는 어노테이션 |
@LocalServerPort | - 스프링 실행 포트를 변수로 가져옴 |
@WithMockUser(roles="USER") | - 인증된 모의 사용자를 만들어서 사용 - roles에 권한 추가함으로써 권한을 가진 사용자가 요청을 할 수 있도록 함 |
@Before | - 매번 테스트가 시작되기 전에 MockMvc 인스턴스를 생성 |
Lombok
@Annotation | @기능 |
@Getter | - 선언된 모든 필드의 get 메소드를 생성 |
@RequiredArgsConstructor | - 선언된 모든 final 필드가 포함된 생성자를 생성 - final이 없다면 생성자를 생성하지 않음 |
@NoArgsConstructor | - 기본 생성자 자동 추가 - public Posts() {}와 같은 효과 |
@Builder | - 해당 클래스의 빌더 패턴 클래스 생성 - 생성자 상단에 선언시 생성자에 포함된 필드만 빌더에 포함 |
'Spring > 스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 카테고리의 다른 글
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 4 [properties] (0) | 2022.04.25 |
---|---|
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 4 [Classes] (0) | 2022.04.25 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 2 [Plugins] (0) | 2022.04.24 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 1 [Gradle] (0) | 2022.04.24 |