스프링 어노테이션

서지우·2023년 7월 28일

Spring Boot

목록 보기
3/18

Spring Bean

- Spring IoC 컨테이너가 관리하는 자바 객체
- 생성 방법만 명시하면 스프링이 알아서 객체를 생성하고 유지하고 소멸시킴

메타 / 합성 어노테이션
메타 어노테이션 - 어노테이션에 붙을 수 있는 어노테이션
합성 어노테이션 - 어노테이션을 여러개 붙인 것


스프링 어노테이션 - Bean등록

@Bean - 외부 라이브러리
@Component - 내가 만든 객체
@Configuration - 설정
@Controller - 주소 매핑
@Service - 비지니스 로직
@Repository - DB, 데이터소스
@ComponentScan - 하위 모든 ~~~


@Bean

개발자가 컨트롤 불가능한 외부 라이브러리를 Bean으로 등록할 때 사용한다.

예를 들면 jackson의 ObjectMapper 등


@ComponentScan

스프링 어노테이션 - Bean 스캔 및 생성

@ComponentScan 어노테이션이 붙은 패키지
하위의 모든 @Bean@Component를 스캔하여
객체를 생성


스프링 어노테이션 - DI

@Autowired - 타입으로 주입 (없으면 이름으로)
@Inject - 타입으로 주입 (없으면 이름으로)
@Resource - 이름으로 주입 (없으면 타입으로)


스프링 어노테이션 - Request

@RequestHeader - 특정 헤더 값을 가져옴
@RequestMapping - 특정 주소를 매핑함
@RequestBody - 요청 body를 가져옴
@RequestParam - 특정 쿼리스트링을 가져옴
@PathVariable - 특정 경로변수를 가져옴
@ModelAttribute - 쿼리스트링을 DTO의 멤버 변수로 binding


스프링 어노테이션 - HTTP Method

@GetMapping - 데이터 조회
@PostMapping - 데이터 삽입
@PutMapping - 데이터 수정
@DeleteMapping - 데이터 삭제


스프링 어노테이션 - Response

@ResponseBody - 응답을 직렬화해서 보냄


스프링 어노테이션 - 기타

@EnableAutoConfiguration

Spring Application Context를 만들 때 자동으로 설정하는 기능을 켠다.
classpath의 내용에 기반해서 자동으로 생성해준다.

@SpringBootApplication

3가지를 하나의 어노테이션으로 합친 것이다.(합성 어노테이션)

@Configuration
@EnableAutoConfiguration
@ComponentScan


@Value

properties에서 값을 가져와 적용할 때 사용한다.

@Valid

유효성 검증이 필요한 객체임을 지정한다.

@Transactional

데이터베이스 트랜잭션을 설정하고 싶은 method에 적용하면
→ 로직이 전부 성공하면 Commit 
→ 하나라도 실패하면 Rollback

@Entity

실제 DB의 테이블과 매칭될 Class임을 명시한다.
테이블과 링크될 클래스임을 나타낸다.

@ControllerAdvice

Class 위에 ControllerAdvice를 붙여서 예외 처리할 것을 명시한다.
어떤 예외를 처리할 것인지는 각 메소드 상단에 @ExceptionHandler(예외클래스명.class)를 붙여서 명시한다.

사용하면서 어노테이션 사용될 때마다 설명을 붙일 예정

참고자료
[Spring] Annotation 정리


자주 사용하는 Lombok 어노테이션

Lombok이란?

Java에서 자주 반복되는 코드(Getter, Setter, 생성자 등...)들을 어노테이션을 통해 자동으로 생성 해 주는 라이브러리

접근자/설정자 자동 생성

@Getter
@Setter

@Getter@Setter모두 클래스나 메서드에서 사용할 수 있으며, 이를 통해서 여러 경우에 사용할 수 있다.

예시

@Getter 
@Setter
public Class Item {
  private Integer itemId;
  private String itemName;
}

생성자 자동 생성

Lombok 어노테이션을 통해서 생성자를 자동으로 생성할 수 있다.

@NoArgsConstructor : 파라미터가 없는 기본 생성자
@AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자
@RequiredArgsConstructor : final, @NonNull인 필드 값만 파라미터로 받는 생성자

예시

@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class Member {
  @NonNull
  private Integer id;
  @NonNull
  private String name;
  private String email;
}

이를 여러 생성자로 생성할 수 있다.

// NoArgsConstructor
Member member1 = new Member();

// AllArgsConstructor
Member member2 = new Member(1, "A");

// RequiredArgsConstructor
Member member3 = new Member(2, "B", "B@naver.com");

ToString 어노테이션

@ToString

@ToString 어노테이션 클래스에 붙여주면 자동으로 생성해준다.
이와 추가적으로 exclude 속성을 사용하면, 특정 필드를 toString()에서 결과를 제거할 수 있다.

예시

@AllArgsConstructor
@ToString(exclude = "id")
public class Member {
  private Integer id;
  private String name;
  private String email;
}
Member member = new Member(1, "test", "test@naver.com");
System.out.println(member);
// Output : Member(name=test, email=test@naver.com)

다만, 멤버 변수 중 객체 타입이 존재하고 순환 참조가 있다면 무한 루프가 발생한다. 이 경우에도 꼭 exclude를 사용하는 것이 중요하다.

주의점
@Data@ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 어노테이션의 묶음이다

JPA같은 ORM을 사용 중라면, 조심해서 사용해야 한다.

ORM은 객체와 객체가 관계를 가지는 조합으로 테이블 간의 연관관계를 표현한다. 아래와 같은 경우 부모 객체와 자식 객체의 toString()에서 문제가 생긴다.

public class Member {
  private String id;
  private String pw;
  private Address addr;
  @Override
  public String toString() {
    return "Member [id=" + id + ", pw=" + pw + ", addr=" + addr + "];
  }
}
public class Address {
  private String zipcode;
  private Member member;  
  @Override
  public String toString() {
    return "Address [zipcode=" + zipcode + ", member=" + member + "]";
  }
}

Member 객체의 toString()을 호출하면 Address 객체의 toString()이 호출 되면서, 다시 Member 객체의 toString()을 호출하며, 무한 반복이 된다.

따라서, include/exclude 속성을 이용해서 toString() 작성 시에 포함하거나, 빼야 하지만 @Data는 설정이 불가능하다.

그러므로 코드가 길어져도 @Data 어노테이션은 지양하는게 좋다.


EqualsAndHashCode 어노테이션

자바 빈을 만들때 사용하는 equalshashCode 메서드를 자주 오버라이딩하는데, @EqualsAndHashCode어노테이션을 사용하면 자동으로 이 메서드를 생성할 수 있다.

예시

public class User {
  private Integer Id;
}

@EqualsAndHashCode(callSuper = true)
public class Member extends User{
  private String name;
  private String email;
}

callSuper 속성을 통해서 equalshashCode 메소드 자동 생성 시 부모 클래스의 필드까지 감안할 수도 있습니다.

Member member1 = new Member();
member1.setId(1);
member1.setName("A");
member1.setEmail("A@naver.com");

Member member2 = new Member();
member2.setId(2);
member2.setName("A");
member2.setEmail("A@naver.com");

member1.equals(member2);
// callSuper = true, false
// callSuper = false, true

Data

@ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 를 합친 어노테이션이다.

다만 JPA와 같은 ORM을 사용한다면 조심하게 사용해야한다. 위에서 @ToString과 마찬가지로 순환참조가 발생하는 경우, 문제가 발생한다.
이 경우에는 exclude를 사용할 수 없기 때문에 코드가 길어져도 @Data 어노테이션을 피하는 것이 좋다.


그 외에도.

@Value : 불변 클래스를 생성할 때 사용
@Builder : 빌더 패턴을 사용할 수 있도록 코드를 생성

profile
미래가 기대되는 풀스택개발자 공부 이야기~~

0개의 댓글