본문 바로가기

Java23

[레벨 1 돌아보기] 정적 팩터리 메서드 사용에 대한 고민 지난 학습로그의 말미에 아래와 같은 글을 남겼습니다. 저는 객체지향 원칙을 지키기 위해 정적 메서드 사용 자체를 줄이려고 합니다. 하지만 정적 팩터리 메서드처럼 정적 메서드의 장점을 잘 이용할 수 있는 순간에는 어김없이 static 키워드를 사용하려 합니다! 이 내용을 본 크루들이라면 정적 팩터리 메서드가 어떤 장점이 존재하는지에 대한 궁금증이 생길 것 같습니다. 저도 그렇고요. 그래서 이번 학습로그에는 레벨 1에서 제가 갖게된 정적 팩터리 메서드를 사용하는 순간에 대한 제 생각을 적어보고자 합니다. 생성자처럼 쓰는데 이름이 있다고? 자동차 경주에 만약 아래와 같은 요구사항이 있었다면 어땠을까요? 처음으로 게임에 등록한 차량은 시작 지점이 1이다. 나머지 차량은 시작지점이 0이다. 시작지점이 0인 차량과.. 2022. 4. 12.
[Java] @BeforeEach와 독립적인 단위 테스트 테스트 코드를 작성하다보면 공통적으로 갖는 상태를 필드 변수로 선언하고 @BeforeEach 애노테이션을 사용하여 각 테스트가 실행 되기 전 필드 변수를 초기화 해줍니다. 테스트 메서드마다 상태를 초기화할 수 있어 독립적으로 테스트를 유지할 수 있고 테스트가 돌아가는 지점의 코드가 간결해져 많이 이용하곤 하는데요. 정말 BeforeEach를 사용하는 것이 좋은 점만 있을까요? @BeforeEach의 사용으로 인해 발생하는 문제점을 알아보고 이 문제를 해결할 수 있는 방안에 대해 포스팅해보려합니다. BeforeEach를 사용한 테스트코드 먼저 @BeforeEach를 사용하여 테스트 픽스처를 초기화하는 테스트를 간단하게 만들어봅시다. class WalletTest { private Wallet wallet;.. 2022. 4. 6.
[Java] db 테스트 체스 5단계는 JDBC api를 사용해서 mysql db와 연동하는 미션입니다. 미션을 수행하면서 가장 핵심적인 고민이 두가지 있었는데요. Dao 레이어를 어떻게 테스트할까? Service 레이어도 결국 Dao를 사용하는데 여기는 어떻게 테스트 하지? 과거 Spring Boot에 ORM으로 JPA를 사용하는 환경에서는 aop인 @Transactional 애노테이션이 테스트 코드에서는 데이터를 롤백해줬기 때문에 데이터베이스에 테스트용 값이 무차별적으로 들어가는 것을 막을 수 있었습니다. 하지만 JDBC는 그렇지 않죠. 그렇다면 위 두 가지 고민을 왜 하는지 먼저 생각해보겠습니다. 운영 db에 무차별적으로 데이터가 들어가는게 싫음 제어할 수 없는 상황에 대한 Test를 해야함 제어할 수 없는 상황에 대한 T.. 2022. 4. 2.
[Java] JDBC API Statement vs PreparedStatement 오늘 제이슨의 수업에서 mysql을 docker container에 올려 실행하는 방법과 간단한 jdbc api 사용법, sql 문법에 대해 배웠습니다. 수업 진행 중 제이슨이 "Statement 와 PreparedStatement가 있는데 차이는 누가 블로그에 올리겠죠." 라고 했고 저는 이 블로그 각을 놓칠 수 없었습니다. 옛날에 JDBC를 공부하던 때의 기억을 되살려 한 번 Statement vs PreparedStatement를 비교하여 포스팅을 해보고자 합니다. 원문은 baeldung 에서 확인할 수 있고 이 포스팅은 원문을 조금 이해하기 쉽게 설명하고자 합니다.. Statement vs PreparedStatement JDBC API에는 두가지 인터페이스가 존재합니다. (인터페이스의 구현체는 .. 2022. 3. 29.
[Java] Singleton LazyHolder는 왜 Thread safe 한가? Singleton 패턴에 대해 공부하다보면 쓰레드로부터 안전한 코드를 작성해야 한다는 이야기를 들어보셨을 것입니다. 그덕에 알게되는 여러가지 방법이 있습니다. Enum을 이용해 Singleton을 보장한다. synchronized 키워드를 메서드에 추가한다. synchronized 블럭을 lazy 생성 조건문 내부에 추가한다. 내부 정적 클래스를 구현하여 내부 클래스에서 생성된 인스턴스를 가져온다. 이 방법들 중에서도 1 ~ 3 번은 각각 단점들이 존재하여 현재는 잘 사용하지 않는 다고 알려져 있습니다. Enum 같은 경우는 상태 정보를 가질 수 없고 synchronized 키워드는 에러 혹은 성능저하를 동반한다. 덕분에 우리는 4번 내부 정적 클래스를 구현하여 내부 클래스에서 생성된 인스턴스를 가져온다.. 2022. 3. 16.
[Java] 의존성 역전 원칙 의존성 역전 원칙에 대해 들어본적 있으신가요? 흔히들 객체지향의 핵심 원칙으로 SOLID를 알고 계실텐데요, 의존성 역전 원칙은 DIP로 객체지향 핵심 원칙의 다섯번째 원칙입니다. 오늘 포스팅에서는 의존성 역전 원칙의 개념에 대해 학습하고 직접 코드를 작성하며 왜 이 원칙을 지켜야 하는가에 대해 몸소 느껴보고자 합니다. DIP DIP는 고수준 모듈을 참조하여 예상치 못한 의존성의 변화를 줄이고자 생겨난 원칙입니다. 여기서 고수준 모듈과 저수준 모듈에 대한 궁금증이 들텐데요. 과연 이 둘은 무슨 의미일까요? 고수준 모듈 상위 수준의 정책으로 하나의 큰 기능이라고 볼 수 있습니다. 간단하게 자바의 Interface를 생각하면 됩니다. 저수준 모듈 고수준 모듈의 기능을 구현하기 위해 필요한 상세 기능. 즉, .. 2022. 3. 7.