코드에 사용된 어노테이션들

Lombok 관련 어노테이션 | Spring 관련 어노테이션 | 테스트 관련 어노테이션 |
@Setter @Data @Log4j |
@Autowired @Component |
@RunWith @ContextConfiguration @Test |
Lombok 관련
Lombok : 컴파일 시 흔하게 코드를 작성하는 기능들을 완성해주는 라이브러리
@Setter : setter 메서드를 만들어주는 역할
-> Restaurant 클래스를 조사해 보면 오른쪽과 같이 @Setter 메서드가 작성된 것을 볼 수 있음.
@Setter에는 3가지 속성을 부여해 줄 수 있다.
속성 | 의미 |
value | 접근 제한 속성을 의미 기본값은 lombok.AccessLevel.PUBLIC |
onMethod | setter 메서드의 생성 시 메서드에 추가할 어노테이션 지정 예제는 @Autowired 라는 어노테이션이 지정되도록 작성하였음 코드는 특히하게 '_' 표기가 사용 -> JDK 버전에 따라 차이 있음 up to JDK7 : @Setter(onMethod=@__({@AnnotationsGoHere})) from JDK8 : @Setter(onMethod_={@AnnotationsGoHere}) // note the underscore after onMethod. |
onParam | setter 메서드의 파라미터에 어노테이션을 사용하는 경우 적용 |
@Data : Lombok에서 가장 자주 사용되는 어노테이션으로 @ToString, @EqualsAndHashCode, @Getter/@Setter, @RequiredArgsConstructor 모두 결합한 형태
-> 한 번에 자주 사용되는 모든 메서드들을 생성할 수 있다는 장점, 만일 세부적인 설정이 필요 없는 경우라면 주로 이용
@Log4j : 로그 개체 생성
Log4j가 존재하지 않을 경우에는 @Log를 이용 -> @Log를 클래스 쪽에 붙여주면 내부적으로 static final로 Logger 객체가 생성되므로 개발 시 별도의 로그 설정할 필요 없이 필요한 코드 만들 수 있음
'Spring Legacy Project'로 생성할 경우 기본적으로 Log4j 설정이 있기 때문에 추가적인 설정 없이 @Log4j만으로 객체 준비 가능
Spring 관련
@Component : 해당 클래스가 스프링에서 객체로 만들어서 관리하는 대상임을 명시
현재 예제의 경우)
@Component가 있는 클래스를 스프링이 읽어주도록 @ComponentScan을 통해서 지정되어 있으므로 해당 패키지에 있는 클래스들을 조사하면서 @Component가 존재하는 클래스들을 객체로 생성해서 빈으로 관리
@Autowired : 스프링 내부에서 자신이 특정한 객체에 의존적이므로 자신에게 해당 타입의 빈을 주입해주라는 표시
-> 스프링은 @Autowired 어노테이션을 보고 스프링 내부에 관리되는 개체 중 적당한 것이 있는지를 확인하고 자동으로 주입, 필요한 객체가 존재하지 않는다면 에러 발생
현재 예제의 경우)
Restaurant 객체는 Chef 타입의 객체가 필요하다는 것 명시
Chef 클래스에 @Component가 없다면 스프링은 Chef 객체를 스프링에서 관리하지 않게 됨. 따라서 실행 시 에러 발생
=> Chef 타입의 객체(bean)을 찾을 수 없어서 적어도 1개 이상의 해당 타입의 객체가 필요하다.
테스트 관련
@ContextConfiguration : 스프링이 실행되면서 어떤 설정 정보를 읽어 들여야 하는지 명시
속성으로는 locations를 이용해서 문자열의 배열로 XML 설정 파일을 명시 가능
classes 속성으로 @Configuration이 적용된 클래스 지정 가능
@RunWith : 테스트 시 필요한 클래스 지정
-> 스프링은 SpringJUnit4 ClassRunner 클래스가 대상이 됨
@Test : junit에서 해당 메서드가 jUnit 상에서 단위 테스트의 대상인지 알려줌
스프링의 의존성 주입
1) 생성자 주입
- Setter 주입과 같은 주입을 생성자를 통해 처리
- 객체 생성 시 의존성 주입이 필요하므로 좀 더 엄격하게 의존성 준비를 체크한다는 장점
- 기존에 스프링에서는 생성자 주입을 하기 위해서 생성자를 정의하고 @Autowired와 같은 어노테이션을 추가해야만 생성자 주입이 이루어졌지만 스프링 4.3 이후에는 묵시적으로 생성자 주입 가능
ex) Chef라는 존재는 호텔에서도 필요하다고 가정
// SampleHotel 클래스
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.ToString;
@Component
@ToString
@Getter
public class SampleHotel{
private Chef chef;
public SampleHotel(Chef chef){
this.chef = chef;
}
}
-> 기존과 달리 생성자 선언하고 Chef를 주입하도록 작성, @Autowired 어노테이션 없이 처리 되고 있음
// HotelTests 클래스
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class HotelTests{
@Setter(onMethod_={@Autowired})
private SampleHotel hotel;
@Test
public void testExist(){
assertNotNull(hotel);
log.info(hotel);
log.info("-----------------------------");
log.info(hotel.getChef());
}
}
생성자 자동주입 + Lombok 결합
// SampleHotel 클래스
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.ToString;
@Component
@ToString
@Getter
@AllArgsConstructor
public class SampleHotel{
private Chef chef;
}
-> @AllArgsConstructor : 인스턴스 변수로 선언된 모든 것을 파라미터로 받는 생성자 작성. 컴파일 결과, 생성자로 Chef를 받도록 만들어짐.
여러 개의 인스턴스 변수들 중에서 특정한 변수에 대해서만 생성자를 작성하고 싶다면, @NonNull과 @RequiredArgsConstructor 어노테이션 이용 ↓
// SampleHotel 클래스
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.ToString;
@Component
@ToString
@Getter
@RequiredArgsConstructor
public class SampleHotel{
@NonNull
private Chef chef;
}
-> @RequiredArgsConstructor : @NonNull이나 final이 붙은 인스턴스 변수에 대한 생성자 만듦
2) Setter 주입
- setXXX() 와 같은 메서드 작성(혹은 Lombok으로 생성)하고 @Autowired와 같은 어노테이션을 통해 스프링으로부터 자신이 필요한 객체를 주입해 주도록 함
출처 : 코드로 배우는 스프링 웹 프로젝트(개정판) - 구멍가게 코딩단
'코드로 배우는 스프링 웹 프로젝트 > Part1.스프링 개발 환경 구축' 카테고리의 다른 글
04 MyBatis와 스프링 연동 (0) | 2020.09.24 |
---|---|
03. 스프링과 Oracle Database 연동 (0) | 2020.09.13 |
02. 스프링의 특징과 의존성 주입2 (0) | 2020.09.10 |
02. 스프링의 특징과 의존성 주입1 (0) | 2020.09.09 |