Spring(7) - 옵션 처리, 롬복

김유담·2024년 6월 18일

spring

목록 보기
7/11
post-thumbnail

김영한 강사님스프링 핵심 원리의 강의 내용과 자료를 이용했음을 밝힙니다.

👨‍💻 테스트 실패

이 내용은 김영한 강사님의 스프링 핵심원리 옵션처리 강의에서 오류발생에 대한 내용이다.

강의를 안들으시는 분은 밑의 옵션처리 내용부터 읽으면 됩니다.

강의를 듣는 사람들 중에 test를 김영한 강사님이 말하신대로 수정을 했지만 오류나는 경우가 있을 것이다.
coreApplicationTests 오류

위의 페이지에 들어가면 알 수 있는데 간략히 말하자면

현재 자동으로 빈 등록하는 AutoAppConfig와 수동 빈 등록하는 AppConfig충돌해서 AutoAppConfig에서 AppConfig를 스캔하지 않으려고 excludeFilter@Configuration을 제외했었다.

@ComponentScan(
    excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =Configuration.class))

하지만 이래도 오류가 난다. 왜 그럴까?

바로 AutoAppConfig 뿐만이 아니라 coreApplicationTest에 있는 @SpringBoot에도 @ComponentScan이 있어서 여기서 AppConfig를 읽어서 충돌이 읽어나는 것이다.

그래서 나는 물론 SpringBoot에서도 excludeFilter를 사용할 수 있겠지만 혹시 뭔일이 일어날지 몰라서 그냥 AppConfig 자체를 다 주석처리 했다 ㅋ.

암튼 강의 질문 게시판 보면 이것 때문에 고생하시는 분들이 꽤 있으신 것 같은데 빠르게 해결하시길!

👨‍💻 옵션 처리

@Autowired를 사용했는데 주입할 빈이 없어도 동작해야 할 때가 있다.

엥? 아니 주입을 할려고 @Autowired를 사용하는건데 주입할 빈이 없는데 @Autowired를 사용한다고?

정확히는 주입할 빈이 없는데 사용하는 것이 아니라 주입할 빈이 있을 수도, 없을 수도옵션인 상황일 때를 말하는 것이다.

그런 경우 어떻게 처리해야 하는지 알아보자.

@Autowired@Autowired(required = true)와 같아서 자동 주입 대상이 없으면 오류가 일어난다.

그래서 자동 중입 대상을 옵션(있을수도? 없을수도? 있다)로 처리하는 방법은 밑의 3가지가 있다.

1. @Autowired(required = false)

 @Autowired(required = false)
 public void setNoBean1(Member noBean1){
     System.out.println("noBean1 = " + noBean1);
 }

참고로 테스트로 이 코드 사용하면 @Autowired에 주입할 빈이 없는데 @Autowired 사용한다고 붉은색 밑줄이 쳐질텐데, 코드상 문제는 없으니 실제 실행하면 잘 돌아간다.

이렇게 required 옵션의 값을 false로 변경하면 주입할 대상이 있을 경우에만 메소드가 실행되고 없는 경우에는 실행되지 않는다.

2. org.springframework.lang.@Nullable

@Autowired
public void setNoBean2(@Nullable Member noBean2){
    System.out.println("noBean2 = " + noBean2);
}

@Nullable을 사용하면 자동 주입할 대상이 없으면 Null이 입력된다.

3. Optional<>

@Autowired
public void setNoBean3(Optional<Member> noBean3){
    System.out.println("noBean3 = " + noBean3);
}

Optional<>을 사용하면 주입할 대상이 없으면 Optional.empty가 입력된다

👨‍💻 롬복(Lombok)

롬복이란 또다시 개발자들을 편하게 하기 위해서 나온 라이브러리이다.

사실 직접 빈등록이 귀찮아서 컴포넌트 스캔으로 빈등록, 의존관계 주입을 하는데
이제는 자동 의존관계 주입(여기서는 생성자 주입을 말한다)도 final, 생성자 만들기 귀찮아서 롬복이라는 것을 쓴다고 한다.

어쩌면 게으른 정도는 인간 > 판다 > 개발자 순이 아닐까?

뭐 암튼 개발자로서는 개꿀 ㅎㅎ

롬복 설치 방법

우선 롬복 라이브러리를 사용하기 위해서는 해야하는 설정들이 있다.

build.gradle에

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.5'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'hello'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

//lombok 설정 추가 시작
configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}
//lombok 설정 추가 끝

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'

	//lombok 라이브러리 추가 시작
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'

	testImplementation 'org.projectlombok:lombok'
	testAnnotationProcessor 'org.projectlombok:lombok'
	//lombok 라이브러리 추가 끝

	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}

이렇게 주석처리를 한 부분들을 추가해주고 gradle 설정을 코끼리를 눌러서 업데이트 해줘야 한다.

참고로 나는 3.2.5 버전 스프링, jdk22를 사용하고 있었는데 gradle이 jdk22를 지원을 안해서 jdk를 17로 변경했다.

java {
	sourceCompatibility = '17'
}

이렇게 바꾸고 오라클에서 jdk17 다운받고 intellij에서 ctrl+alt+shift+s 눌러서 SDK에서 17로 변경해주면 된다.

그리고 file>settings 들어가서 검색창에 annotation Processors 검색해서 Enable annotation processing에 체크해주고

검색창에 plugins에서 lombok 검색해서 설치해주면 된다.

(설정하고 apply 꼭 눌러줘야 반영된다!)

롬복 기능

1. getter, setter

@Getter
@Setter
public class HelloLombok {

    private String name;
    private int age;

    public static void main(String[] args) {
        HelloLombok helloLombok = new HelloLombok();
        helloLombok.setName("asf");
        String name = helloLombok.getName();

        System.out.println("name = " + name);
    }
}

이런식으로 @Getter, @Setter 만 위에 붙여주면 getter, setter를 선언 안하고 사용이 가능하다.

2. toString

@Getter
@Setter
@ToString
public class HelloLombok {

    private String name;
    private int age;

    public static void main(String[] args) {
        HelloLombok helloLombok = new HelloLombok();
        helloLombok.setName("asf");

        System.out.println("helloLombok = " + helloLombok);
    }
}

그리고 @ToStirng을 사용하면 toString 기능도 지원하는데 이를 출력해보면

helloLombok = HelloLombok(name=asf, age=0)

이런식으로 정리되서 나온다.

3. 생성자

@RequiredArgsConstructor를 통해서 생성자도 만들수 있다.

앞에서 Required가 붙은 만큼 필요한 필드들에 대해서만 생성자를 만들어주는 여기서 필요한 필드란 final이 붙은 필드를 말하는 것이다.

그러니 생성자 메소드를 따로 안만들어도 되는 것이다.

@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
	private final MemberRepository memberRepository;
	private final DiscountPolicy discountPolicy;
}

이렇게만 해도 클래스 이름의 생성자가 만들어지는 것!

그럼 오늘은 여기까지~~~

profile
잘하진 못할지언정 꾸준히 하는 개발자:)

0개의 댓글