무지성 어노테이션 사용을 막기위해 코드 작성 시 어노테이션 사용 이유와 용도를 적어놓고 주석으로 처리하기로 했다.
두루뭉술하게나마 알고 있긴하지만 이런 식으로 쓰다보면 안 보고 쓸 수 있는 어노테이션이 많아지지 않을까
아래의 3개 어노테이션을 합쳐놓은 구성
@ComponentScan
@Component 시리즈 어노테이션이 붙은 클래스를 발견해 빈으로 등록
@SpringBootConfiguration
환경설정 빈
@EnableAutoConfiguration
spring.factories 내부에 여러 Configuration들을 조건에 따라 빈 등록
@Component, @Service, @Repository, @Controller, @Configuration, @Bean 같은 어노테이션이 사용된 클래스를 Context에 등록해준다.
클래스를 Bean으로 등록하기 위한 어노테이션이다.
@Component(value="beanName")
위와 같이 Bean의 이름을 지정해줄 수 있으며 지정하지 않을 시 class의 이름을 camelCase로 변경한 것을 사용한다.
개발자가 컨트롤하기 쉽지 않은 외부 라이브러리를 Bean으로 등록하기 위한 어노테이션이다.
클래스를 Bean으로 등록하기 위한 어노테이션이다.
MVC 패턴에 맞게 개발 시 클래스들의 역할을 나타내는 용도로 사용한다.
Controller 중 메소드의 반환 값을 JSON 형태로 반환한다.
@Controller와 @ResponseBody 기능이 추가된 느낌
설정용 클래스를 Bean으로 등록하기 위한 어노테이션
속성, Setter, 생성자에 사용하면 Type에 따라 Bean을 주입해준다.
@RequestMapping("요청 URL")
@RequestMapping("요청 URL, method=RequestMethod.요청 받는 형식")
요청 URL을 어떤 형식으로 요청 받을지 어떤 method가 처리할 지 mapping 해주는 어노테이션이다.
요청받을 형식을 지정받는 @RequestMapping이라고 생각하면 편하다. Post 형식이면 @PostMapping
사실상 이게 코드도 적게 쓰고 알아보기도 편해서 권장
public String Test (@RequestBody UserVO userVO)
Body에 적혀져 요청된 값을 자바 객체로 변환시켜준다.
메소드에 선언하여 결과 값 자바 객체를 HTTP Body 내용으로 매핑하여 클라이언트로 전송하는 어노테이션
URL 뒤에 붙는 파라미터 값을 가져올 때 사용하는 어노테이션
@GetMapping("/test")
public String Test(@RequestParam("index") int idx){}
/test?index=1 과 같이 uri가 전달되면 해당 파라미터를 받아온다.
@RequestParam 안의 이름과 uri 뒤에 전달인자의 이름이 같아야 한다.
@Getmapping("/test/2")
처럼 요청했을 시 뒤의 2
를 받아오기 위해 사용하는 어노테이션
@PathVariable을 사용 후 받아올 형식을 지정한다.
public ResponseEntity<MemberDto> getMember(@PathVariable int number)
Properties 값을 불러오기 위해 사용하는 어노테이션
@Value("${secretKey}")
@PropertySource("classpath:{경로}")
읽어들일 Properties 파일 지정하는 어노테이션
bean 초기화 후 한 번만 호출해도 되는 메소드에 사용한다.
주로 메소드에 사용한 후 메소드의 필드를 한 번만 초기화해도 될 때
데이터베이스의 테이블과 일대일로 매칭되는 객체를 뜻한다.
DB에 저장될 실제 테이블 명칭을 정할수 있다.
저장될 데이터에 설정을 할 수 있다.
해당 테이블의 기본키로 설정될 컬럼을 지정
기본 키 컬럼의 생성 방법을 정하는 어노테이션
(persistence provider가) 특정 DB에 맞게 자동 선택
기본키 생성 DB에 위임
어떤 DBMS를 사용하더라도 동일하게 동작하기를 원할 경우 사용
데이터베이스에 키 생성 전용 테이블을 하나 만들고 이를 사용한다.
Entity 객체에 속성으로 지정되어있지만 DB에는 저장하지 않을 속성을 지정할 수 있다.
영속성관리를 위해 EntityManager를 자동 등록할 때 사용하는 어노테이션
객체 입장에서 공통 매핑정보가 필요할 때 어노테이션으로 공통되는 필드가 있다면 상속받을 클래스에 선언하고 상속받아서 사용할 수 있다.
다른 엔티티 객체를 필드로 정의했을 때 연관관계 매핑하기 위해 사용하는 어노테이션
엔티티를 조회할 때 실제 엔티티를 조회
엔티티를 실제 사용할 때 조회한다.
프록시 객체를 넣어놓고 사용할 시 실제 엔티티를 조회하는 방식
OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER
연관관계 설정 시 매핑할 외래키를 설정한다.
연관관계를 설정할 때 외래키를 지정하지 않는다면 중간 테이블이 생긴다.
다대다 연관관계 설정 시 외래키 관리 테이블에 대한 설정을 하는 어노테이션
개발자가 원하는 쿼리를 직접 짤 수 있게하는 메소드
JPQL을 사용해 직접 쿼리를 작성할 수 있다.
@Query로 쿼리를 작성할 때 Select를 제외 쿼리에서 사용되는 어노테이션이다.
클래스나 메서드에 붙여줄 경우 해당 범위 내 메서드가 트랜잭션이 되도록 해준다.
해당 영속성 컨텍스트를 생성해준다.
서버단은 Camel Case, 클라이언트단에서는 Snake Case를 사용하기 때문에 데이터의 Key값이 서로 달라 제대로 매핑이 안될 수 있다.
이런 상황을 방지하기 위해 JsonProperty를 통해 이름을 설정해 매핑을 제대로 시켜준다.
@JsonProperty("phone_number") // json으로 들어온 phone_number를 phoneNumber 필드와 매핑 시켜준다.
var phoneNumber;
또한 access 속성을 통해 접근 제어 역시 가능하다.
access 속성을 쓰기 적용으로 설정할 시 쓰기에만 접근을 허용해 응답결과를 생성할 때는 해당 필드는 제외된다.
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Column(nullable = false)
private String password;
@JsonProperty
를 적용할 컬럼이 많다면 일일이 써주는 것이 비효율적이다.
@JsonNaming 은 전략을 정해 해당 엔티티 클래스에 적용시켜 한번에 처리할 수 있도록 한다.
값 타입을 컬렉션에 담아 사용하기 위한 어노테이션
DB에서는 따로 컬렉션을 저장할 수 없어 컬렉션에 해당하는 테이블을 하나 추가해 컬렉션을 구현한다.
스프링부트 어플리케이션 테스트에 필요한 거의 모든 의존성을 제공하는 어노테이션
통합 테스트를 제공하는 기본적인 스프링부트 테스트 어노테이션
Junit4 사용시 @SpringBootTest 기능은 반드시 JUnit의 SpringJUnit4ClassRunner 클래스를 상속 받는 @RunWith(SpringRynnver.class)와 함께 사용해야 한다.
Junit5 사용 시 명시할 필요 없음
@Test가 선언된 메소드는 테스트를 수행하는 메소드가 된다.
Junit은 각각 테스트가 독립적 실행되는 것이 원칙임으로 @Test마다 객체를 생성
@Ignore가 선언된 메소드는 테스트를 실행하지 않게 한다.
@Test 메소드 실행마다 실행
@Test 메소드에서 공통 사용하는 코드를 @Before에 선언해 사용
@Test메소드 실행마다 실행
@Test보다 먼저 한 번만 수행되어야 할 경우에 사용
@Test보다 나중에 한 번만 수행되어야 할 경우에 사용
해당 객체에 대해 유효성 검사를 수행한다.
@Valid의 기능을 포함한 스프링 제공 어노테이션
group을 지정해 특정 컬럼만 검증할 수 있다.
이 어노테이션을 어디서 선언할 수 있는지 정의한다.
설정시 ElementType을 통해 설정한다.
어노테이션이 실제로 적용되고 유지되는 범위를 설정한다.
RetetionPolicy를 통해 설정한다.
RetetionPolicy.RUNTIME
컴파일 이후에도 JVM에 의해 계속 참조
RetetionPolicy.CLASS
컴파일러가 클래스를 참조할 때까지 유지
RetetionPolicy.SOURCE
컴파일 전까지만 유지, 컴파일 이후 사라짐
Validator와 시켜주는 역할을 수행하는 어노테이션
validatedBy를 통해 매핑할 인터페이스를 지정한다.
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = TelephoneValidator.class)
필드의 값으로 null값만 허용
필드의 값으로 null을 허용하지 않음
"" " "은 허용
필드의 값으로 null, ""을 허용하지 않음
" "은 허용
필드의 값으로 null, ""," "을 허용하지 않음
BigDecimal, BigInteger, int, long 등의 타입을 지원
$numberString보다 작은 값 허용
$numberString보다 큰 값 허용
$number보다 작은 값 허용
$number보다 큰 값 허용
양수 허용
양수 및 0 허용
음수 혀용
음수 및 0 허용
미래 날짜 허용
미래, 현재 날짜 허용
과거 날짜 허용
과거, 현재 날짜 허용
이메일 형식 검사 ""는 허용
$number1의 정수 자릿수와 $number2의 소수 자릿 수 허용
true 체크 null은 체크하지 않음
false 체크 null은 체크하지 않음
number2 사이의 범위 허용
정규식을 검사한다.
Spring에서 제공하는 @(Rest)Controller에서 발생하는 예외 관리, 처리 기능 어노테이션
범위 설정을 별도로 하지 않을 시 전역 범위에서 예외를 처리한다.
basePackages
예외 관제하는 범위 설정
@(Rest)Controller가 적용된 빈에서 발생하는 예외를 잡아 처리하는 메서드 정의 시 사용
value
어떤 예외 클래스를 처리할 지 등록할 수 있으며 배열 형식도 전달 가능해 여러 예외 클래스를 등록할수도 있다.
ex) value = RuntimeException.class
application.properties 파일에 설정된 값을 가져오기 위한 어노테이션
@Value("${springboot.jwt.secret}"
해당 필드에 대한 Getter 메소드 생성
해당 필드에 대한 Setter 메소드 생성
매개변수 없는 생성자 자동 생성
모든 필드 매개변수로 갖는 생성자 자동생성
필드 중 final이나 @NotNull이 설정된 변수를 매개변수로 갖는 생성자 자동생성
필드의 값을 문자열로 조합해서 리턴
exclude
속성을 통해 제외할 필드를 선택할 수 있다.
객체의 동등성과 동일성을 비교하는 연산 메텍스트서드 생성
동등성 : 같은 정보를 가진 것
동일성 : 같은 객체
위의 어노테이션을 포괄하는 어노테이션
@Data와 비슷하지만 필드를 변경할 수 없는 불변객체를 생성한다.
사용 시 @Setter를 제외한 어노테이션들이 추가된다.
@Getter @AllArgsConstructor @ToString @EqualsAndHashCode @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) 멤버 변수들을 private, final 설정하는 어노테이션
문서 자동화를 위해 사용하는 어노테이션
해당하는 파라미터 문서화를 위해 사용하는 어노테이션이다.
@ApiParam(value="파라미터에 대한 설명",required=true) //required 속성은 해당 파라미터가 필수인지 아닌지에 대해 사용
2022.8.24 수정
2022.9.28 수정
유효성 검사 어노테이션 추가
2022.11.24 수정
- JsonProperty, JsonNaming 추가
- @RequiredArgsConstructor 의존성 주입
- @Value
2022.11.25 수정
- @PostConstruct 추가
2023.01.27 수정
- @Value, @FieledDefaults 추가
2023/02.08 수정
- @ApiParam 추가