반응형
- Simple Logging Facade for Java의 약자로 로깅 프레임워크(ex: logback, log4j)에 대해 추상화 역할을 합니다.
- 최종 배포 시 사용자가 원하는 로깅 프레임워크로 배포할 수 있게 되는데
- Facade에서 의미를 찾을 수 있습니다.
- 소프트웨어 공학 디자인 패턴에서는 크게 생성, 구조, 행위 패턴으로 나눌 수 있는데,
- Facade Pattern은 그 중 구조패턴에 속합니다.
- Facade Pattern 특징
- 서브 클래스들의 기능들을 미리 구현해놓고, 상위의 인터페이스를 제공함으로써 복잡한 로직을 알 필요가 없어진다.
- 인터페이스에만 접근하면 되므로 사용성이 용이하고, 사용자 또는 시스템끼리의 결합도를 낮춰 의존성이 감소된다.
- 따라서, 시스템의 복잡성을 감추고, 사용자가 시스템에 접근할 수 있는 인터페이스를 제공하는 것에 목적을 둔다.
/* 출처 : https://ko.wikipedia.org/wiki/퍼사드_패턴 */
/* Complex parts */
class CPU {
public void freeze() { ... }
public void jump(long position) { ... }
public void execute() { ... }
}
class Memory {
public void load(long position, byte[] data) {
...
}
}
class HardDrive {
public byte[] read(long lba, int size) {
...
}
}
/* Façade */
class Computer {
public void startComputer() {
CPU cpu = new CPU();
Memory memory = new Memory();
HardDrive hardDrive = new HardDrive();
cpu.freeze();
memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
cpu.jump(BOOT_ADDRESS);
cpu.execute();
}
}
/* Client */
class You {
public static void main(String[] args) throws ParseException {
Computer facade = /* grab a facade instance */;
facade.startComputer();
}
}
- 위키피디아에 기재된 JAVA 소스 예제를 살펴보면
- CPU, Memory, HardDrive -> 서브 클래스
- Computer -> Facade Interface
- 컴퓨터 내부 부품에 대한 서브 클래스들이 선언되어 있고, Facade startComputer() 에서 상세 로직이 기재된 걸 볼 수 있습니다.
- 컴퓨터 부품을 조립 또는 환경 구성을 한다고 가정을 한다면 순서와 해당 부품을 이용한 방법 등이 중요할 것입니다.
- 하지만, 사용자인 우리는 Computer의 startComputer() 을 호출한다면 순서, 방법 등과 관계없이 Computer을 구성할 수 있습니다.
- 이처럼 우리는 복잡한 내부 로직을 알 필요 없이 인터페이스 호출로 간단하게 사용할 수 있게 됩니다.
- SLF4J는 java.util.logging, logback, log4j을 사용할 수 있는 인터페이스 역할을 해줍니다.
- 하지만, SLF4J 추상화된 프레임워크이기 때문에 단일 사용으로는 동작하지 않습니다.
- 구현되어 있는 log library를 사용해 logging 작업을 동작해줍니다. (연결해주는 브릿지 역할을 해준다 생각하면 되겠습니다.)
- 따라서, SLF4J는 단일 사용이 아닌 logback, log4j 등과 같이 사용해줍니다.
- 그렇다면 SLF4J를 사용할게 아니라 log4j만 사용하면 되지 않냐 생각할 수 있는데,
- 최근 log4j의 보안 취약점 이슈를 예로 들어보자면
- 보안 취약점이 발견된 log4j의 버전을 사용하고 있을 경우 조치 방안에 따라 버전을 변경해줘야 했습니다.
- 하지만, 지속해서 취약점이 발견되고 있는 상황에서 log4j의 사용을 지속하기 어렵다 판단이 된다면 다른 log library로 변경을 해줘야 하는데
- 이럴 경우 SLF4J를 사용하고 있었다면 설정 파일 변경(ex: pom.xml maven dependency 수정) 하나로 수정이 용이하다는 것입니다.
- 보통 log4j를 사용한다 하면 java 소스들에
import org.apache.log4j.Logger
Logger log = Logger.getLogger(This.getClass));
log.info("로그"); - 이런 식으로 import가 됐을텐데, 일일히 import 제거해주고, 새로 import 시켜주고 하는 작업이 줄어들 수 있는겁니다.
- 필요에 따라 SLF4J로 마이그레이션(log4j -> SLF4J)하는 방법도 있습니다.
- 한가지 유의해야할 점을 알려드리자면
- 메뉴얼 > Binding with a logging framework at deployment time 문단을 보시면 binding 메뉴얼이 있습니다.
- one and only one binding 라는 문구가 강조되어 있는데
- SLF4J 사용 시 여러 logging library 사용할 수 없고, 하나만 사용하게 되어있습니다.
- 사용 메뉴얼, FAQ, SLF4J로 마이그레이션 하는 방법 등이 기재되어 있으니 SLF4J의 공식 문서 참고해보시길 바랍니다.
https://www.slf4j.org/manual.html
반응형
'Java' 카테고리의 다른 글
Spring Boot application.properties 값 가져오기 (0) | 2023.01.04 |
---|---|
[STS] SpringBoot Database postgreSQL JDBC 연동(Hibernate, JPA, SLF4J2 + Log4j2) (1) | 2023.01.04 |
[STS] Spring Boot Maven Project Create(메이븐을 이용한 스프링부트 프로젝트 생성) (0) | 2022.12.20 |