Java 42

[Effective Java] 아이템 23 : 태그 달린 클래스보다는 클래스 계층구조를 활용하라

예제 코드는 여기서 보실 수 있습니다. 0. 들어가며 이번 아이템은 상속을 활용해야하는 이유에 대한 내용을 담고있습니다. 아래에서 천천히 알아보겠습니다. 1. 태그 달린 클래스 아이템의 제목에서도 그렇고, 책에서도 태그 달린 클래스 라는 말이 자주 등장하는데요. 그 의미가 궁금해졌습니다. 1.1 태그란? 저는 태그란 클래스를 더 세분화 시키기 위한 필드/상태라고 이해했습니다. 특정 클래스에 이런 상태를 붙여서 더 세분화된 것이 태그 달린 클래스인 것이죠. 제가 친구들에게 “얼음이 녹으면?” 이라는 질문을 합니다. 그러면 친구들은 다음과 같이 대답합니다. 문과 친구 : “얼음이 녹으면 봄이 온다는 거지” 이과 친구 : “물이 되지” 그러면 저는 친구라는 클래스에 질문을 했지만, 문과인지 이과인지에 따라 다..

Java 2023.01.10

[Effective Java] 아이템 17. 변경 가능성을 최소화하라

예제 코드는 여기서 보실 수 있습니다. 0. 들어가며 이번 아이템은 불변 클래스(Immutable Class) 에 대한 내용입니다. 클래스를 불변으로 만들기 위한 규칙과 장단점 등에 대해 알아볼 예정입니다. 1. 불변 클래스 불변 클래스란 말 그대로 내부의 값을 수정할 수 없는 클래스를 의미합니다. 생성된 시점에 상태가 확정되어, 소멸되기 전까지 달라지지 않습니다. 이렇게 불변 클래스로 만들면 설계, 구현, 사용이 쉬워지며 오류 발생 여지도 줄어들게 됩니다. 이 대표적인 예가 바로 java.util.Date 와 java.time.LocalDate 입니다. java.time 패키지 TMI(Joda time) Java 8 릴리즈 전까지 사용되던 Date 는 가변 클래스입니다. 이 때문에 위에서 말한 여러 문..

Java 2023.01.04

[Effective Java] 아이템 10. equals는 일반 규약을 지켜 재정의하라

예제 코드는 여기서 보실 수 있습니다. 0. 들어가며 equals 메서드는 두 개체가 같은지 확인하는데 사용됩니다. Java 에서 두 개체가 같은지 확인하는 기준은 동일성 과 동등성 두가지로 나누어집니다. 0.1 동일성 동일성 : 두 개 이상의 사상(事象)이나 사물이 서로 같은 성질. 동일성이란 두 개체가 완전히 같은지를 나타내는 성질입니다. 위 그림의 refVar2 와 refVar3 는 지역변수로서는 개별적으로 존재하지만, 같은 객체2를 가리킵니다. 즉, refVar2 == refVar3 이 성립하며 이는 두 변수 refVar2, refVar3 은 동일하다고 표현할 수 있습니다. 0.2 동등성 동등성 : 가치, 등급 따위가 서로 똑같음. 동등성이란 두 개체가 논리적으로 같은지를 나타내는 성질입니다. S..

Java 2022.12.28

[Effective Java] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

예제 코드는 여기서 보실 수 있습니다. 0. 들어가며 이번 아이템은 싱글턴 패턴을 안정적으로 구현하기 위한 방법들에 대한 내용입니다. 각각의 방법들을 예제 코드와 함께 알아보겠습니다. 1. 싱글턴이란? 싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. (Effective java 책 23p) '오직 하나만 생성할 수 있다' 라는 말은 '인스턴스가 하나만 존재해야 한다' 라고 해석할 수도 있습니다. 즉, 싱글톤 구현을 위해서는 Java 의 런타임 환경인 JVM 에서 단 하나의 인스턴스만 생성되도록 구현해야 한다고 생각할 수 있습니다. 1.1 싱글턴의 특징 1. 메모리 절약 모든 객체는 생성되면 JVM 의 heap 메모리에 저장됩니다. 그러나..

Java 2022.12.14

TestContainer 재사용하기(feat. 테스트 실행시간 최적화)

0. 계기 Sikdorak 프로젝트를 진행하며 팀원들과 테스트 DB에 대한 고민을 했었는데요.(ku-kim,Seokho-Ham) 토론한 결과 실행환경과 비슷한 조건에서 테스트하기위해 TestContaienr 를 도입하기로 결정했습니다. 하지만, 테스트 수행 시 컨테이너를 실행하는 과정이 여러번 반복되어 시간이 많이 걸리는 것이 아쉬웠는데요. 그래서 이를 해결해보기 위해, Testcontainer 에 대해 알아보며 개선하게 되었습니다. (관련 PR : https://github.com/jjik-muk/sikdorak/pull/55) 테스트 실행 환경 1. 문제상황 @Testcontainers public abstract class MysqlTestContainer { private static final ..

Java 2022.08.06

SwaggerUI + Spring REST Docs 함께 사용하기(feat. Rest Assured)

이 글은 딥다이브한 내용을 쭉 풀어쓴 내용입니다. 시간이 없으신 분은 전체 소스코드를 참고해 주세요. 0. 시도하게된 이유 0.1 Swagger 경험 이전에 TODO List 라는 프로젝트에서 Swagger 를 사용해본 적이 있습니다. API 문서가 자동으로 생긴다는 점은 편했지만, 비즈니스 로직과 API 를 위한 코드가 섞여있다는 것이 마음에 들지 않았습니다. 0.2 Spring REST Docs 시도 그러던 중 우아한형제들 기술블로그를 인상깊게 보아 Spring REST Docs 를 시도해보게 되었습니다. Spring REST Docs 는 다음과 같은 장점이 있었습니다. API 문서가 테스트코드 통과 후 생성됨 비즈니스 로직에는 API 문서 관련 코드가 전혀 없음 커스텀이 자유로움 하지만, 다음과 같..

Java/Spring 2022.07.31

SpringBoot 설정 암호화

Github Action 을 이용한 배포 자동화를 진행해보려니, application.properties 의 민감정보를 어떻게 처리해야할지 고민이 되었습니다. 여러 방법을 찾아보다가, 찾은 선택지는 다음과 같습니다. 민감정보 환경변수(변수) 관리 Secrets 에서 설정파일 내용을 읽어와서 Github Action 에서 설정파일 생성 민감정보 암호화 결론부터 말씀드리면 저는 4번 방법을 선택했는데요. 각 방법에 장단점이 있어서, 간단하게 정리해봤습니다. 방법 장점 단점 1. 민감정보 환경변수 관리 - 설정파일을 Github 에 올릴 수 있음 - 개발, 빌드, 서버 세곳의 환경변수를 관리해야함 - 관리할 민감정보가 많아질수록 관리하기 힘듦 2. Secrets 에서 설정파일 내용을 읽어와서 Github Ac..

Java/Spring 2022.05.27

JPA소개

이 글은 자바 ORM 표준 JPA 프로그래밍을 보고 작성한 글 입니다. 혹시 잘못된 내용이 있을 경우 편하게 댓글 달아주시면 감사하겠습니다. SQL 중심적인 개발의 문제 SQL 중심적인 개발을 주로 하던 시절에는 CRUD 쿼리 개발을 중심으로 해야했습니다. INSERT, UPDATE, SELECT, DELETE 등등의 쿼리 작성 데이터가 담겨있는 자바 객체의 속성을, 쿼리 파라미터로 설정하는 로직 쿼리 결과를 다시 자바 객체로 변환하는 로직 작성 등등 비슷하면서 귀찮은 작업들이 정말 많았고, 테이블이 수정될 경우 모든 SQL을 수정해야 하는 경우도 있었습니다. 그래서 전체 개발시간 중 쿼리를 작성하거나, 쿼리와 관련된 자바 코드를 작성하는 시간이 차지하는 비중이 아주 많았습니다. 패러다임의 불일치 객체 ..

Java/JPA 관련 2022.05.10

Entity 의 Equals 와 HashCode 를 오버라이드 해도 될까?

엔티티 검증 테스트 코드를 작성하다가, 두 객체가 같은지 비교하는 로직의 작성이 필요했습니다. @Test void TestSomething() { // ... 생략 assertThat(resultEntity.getId()).isEqualTo(expectedEntity.getId()); assertThat(resultEntity.getName()).isEqualTo(expectedEntity.getName()); assertThat(resultEntity.getPrice()).isEqualTo(expectedEntity.getPrice()); assertThat(resultEntity.getStockQuantity()).isEqualTo(expectedEntity.getStockQuantity()); }이..

Java/Spring 2022.04.27

토비의 스프링 1장 - 오브젝트와 의존관계

토비의 스프링 1장 - 오브젝트와 의존관계 관심사의 분리 관심사 추출 세상에는 변하는것(변할 가능성이 있는것)과 변하지 않는것이 있는것처럼, 코드도 마찬가지 입니다. DB에 회원 DAO에는 다음과 같은 로직이 필요합니다. DB 연결 회원 관련 쿼리 요청 이 로직들이 하나의 메소드에 있다면, 무조건 개선해야할 메소드이죠. 하나의 메소드는 하나의 관심사만 가져야 하지만, 이 메소드에서는 2가지의 관심사가 모두 있습니다. 그래서 변하는것과 변하지 않는것을 잘 파악해서 을 따로 추출해 내는것이 중요한데요. 변하는것을 따로 추출하면 요구사항의 변경이 있을 경우, 변경점이 하나이기 때문에 유지보수가 수월해집니다. 이렇게 관심사를 추출하는 방법에는 메소드로 추출, 상속을 통한 추출 등이 있습니다. 확장성 클래스 분리..

Java 2022.03.11