[22.10.07] Daily 회고록 (이펙티브 자바 - 서비스 제공자 프레임워크, 리플렉션, 빌더)
일간 회고록(TIL)

[22.10.07] Daily 회고록 (이펙티브 자바 - 서비스 제공자 프레임워크, 리플렉션, 빌더)

서비스 제공자 프레임워크

확장 가능한 애플리케이션을 만드는 방법

서비스 제공자 프레임워크는 다양한 서비스 제공자들이 하나의 서비스를 구성하는 시스템

클라이언트가 실제 구현된 서비스를 이용할 수 있도록 하는데, 세부적인 구현 내용을 몰라도 이용 가능하다.

 

1. 서비스 제공자 인터페이스와 서비스 제공자(구현체)

2. 서비스 제공자 등록 API (서비스 인터페이스의 구현체를 등록하는 바업ㅂ)

3. 서비스 접근 API (서비스의 클라이언트가 서비스 인터페이스의 인스턴스를 가져올 때 사용하는 API)

 

즉 확장 가능한 인터페이스들을 서비스 제공자 프레임워크라고 한다

전혀 다른 jar 파일에 존재하는 구현체를 위한 인터페이스를 만드는 것

 

리플렉션

리플렉션이란 구체적인 클래스 타입을 알지 못하더라도, 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API이다.

서비스 제공자 인터페이스가 없다면 각 구현체를 인터페이스로 만들 때 리플렉션으로 만들어야 한다

 

클래스 로더를 통해 읽어온 클래스 정보를 사용하는 기술이며 컴파일 시간이 아닌 실행시간에 동적으로 특정 클래스 정보를 추출할 수 있는 프로그래밍 기법이다.

 

리플렉션을 사용해 동적으로 클래스를 읽거나, 인스턴스를 만들거나, 메소드를 실행하거나, 필드의 값을 가져오거나 변경하는 것이 가능하다.

- 특정 어노테이션이 붙어있는 필드 또는 메소드 읽어오기 ex) @Bean

- 특정 이름 패턴에 해당하는 메소드 목록 가져와 호출하기

 

 

JAVA - 리플렉션 (Reflection)이란?

리플렉션(Reflection)이란? 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API입니다. 💡 컴파일 시간이 아닌 실행 시간에

kdg-is.tistory.com

 

빌더

생성자가 많거나, 초기화할 변수가 많다면 빌더를 사용하는게 좋다 (@Builder)

 

생성자 체이닝

생성자가 많으면 생성자 내부의 중복 내용이 많아지게 된다.

생성자 체이닝이란 생성자가 여러개인 경우 각 생성자가 다음 생성자를 호출하도록 체이닝하여 관리하는 것이다.

이 방법의 단점은 생성자 내의 매개변수 순서를 알기 어렵고(ide 도움 없이), 필드가 많아지면 복잡해지게 된다.

 

다른 방법으로는 setter를 이용하는 것이 있는데, 이를 이용하면 객체 생성이 간단해지지만 필수적으로 필요로 하는 값이

세팅이 되지 않게 되어 불완전한 객체 생성을 야기할 수 있다. setter로 필요로 하는 모든 값이 채워지기 전에 실행되버릴 수 있다. (문서화를 필요로 한다)

 

또한, setter를 사용하면 불변필드로 만들 수 없다. final 키워드를 붙이면 초기나 생성자에서 초기화를 해주어야 하기 때문이다.

 

빌더는 이러한 점들을 보완하기 위해 사용된다.

NutritionFacts에도 Builder와 같은 필드, 생성자가 재정의된다는 단점이 있다

다음과 같이 사용해서 필요로 하는 필드는 반드시 채울 수 있되, 다른 단점들도 보완하게 된다.

그러나 코드를 이해하기 어렵게 만들고, 필드가 중복이 된다.

 

코드의 수를 줄이기 위해선 롬복의 @Builder 어노테이션을 이용한다.

코드양이 줄어 간단하다는 장점이 있으나, 모든 매개변수를 초기화하는 생성자가 생겨 생성자가 생기게 된다. 이를 막기 위해서는 @AllArgumentConstructor(accessLevel = protected) 식으로 만들면 된다. 

다음과 같이 적용하면 필수 필드를 정의하도록 할 수 있으나, 문서화가 필수로 필요할 것 같다.