개발 공부 기록하기/01. JAVA & Kotlin 38

짧은 코멘트와 함께하는 이펙티브 자바) #5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

짧은 코멘트 의존성 주입은 정말 중요한 개념으로, 스프링을 사용하는 개발자라면 누구나 의존성 주입을 활용하고 있다. 의존성을 주입을 적절하게 함으로써, 하위 구현체를 갈아 끼울 수가 있고 테스트도 아름답게 작성할 수가 있는데... 의존성은 나중에 찐하게 한 번 다뤄봐야 겠다 ㅎㅎ 자원을 직접 명시하지 말고 의존 객체 주입을 사용해라 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글톤 방식이 적합하지 않다 예를 들어, 맞춤법 검사기가(SpellChecker) 안에 어휘사전(Lexicon)을 가지고 있다고 하자 정적 유틸리티 클래스로 구현 public class SpellChecker { private static final Lexicon dictionary = ...; privat..

짧은 코멘트와 함께하는 이펙티브 자바) #4 인스턴스화를 막으려거든 private 생성자를 사용하라

짧은 코멘트 유틸성 클래스에 private 생성자가 없으면 '엇 이 개발자분 Effective Java 안읽으셨나?' 라는 생각이 가장 먼저 든다 ㅋㅋㅋ 클래스 본문의 길이를 줄이고 싶어, lombok의 NoArgsConstructor(accessLevel = AccessLevel.PRIVATE)을 사용하는 것을 개인적으로 선호한다 ㅎㅎ 인스턴스화를 막고 싶을 때는 private 생성자를 사용하면 된다 단순히 정적 메소드와 정적 필드만을 담은 클래스를 만들고 싶다면, 그리 곱게 보이지는 않지만 아래의 경우에 쓸모가 있다 기본값이나 관련 메소드들을 모아 놓을 때 (ex. java.util.Arrays, java.lang.Math) 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메소드를 모아 놓을 때 f..

짧은 코멘트와 함께하는 이펙티브 자바) #3 private 생성자나 열거 타입으로 싱글턴임을 보증하라

짧은 코멘트 Spring Bean의 기본 scope이기도 한 싱글톤 알아두면 유용하다. Spring을 사용할 경우 객체를 직접 싱글톤으로 만들 일을 드물지만, 정말 간혹 쓰는 경우가 있다. 그럴때는 주로 2번의 방법을 사용했다. 싱글톤 보증 싱글톤 : 인스턴스를 오직 하나만 생성할 수 있는 클래스 (GOF) 함수와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트가 싱글톤의 예이다. 클래스를 싱글톤으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다 싱글톤을 만드는 방법과 장단점은 아래와 같다 방법 1 생성자는 private으로 감춰두고, 인스턴스를 만들 수 있는 유일한 수단으로 public static 멤버를 하나 만들어 둔다. public class Elvis { // fina..

짧은 코멘트와 함께하는 이펙티브 자바) #2 생성자에 매개변수가 많다면 빌더를 고려하라

짧은 코멘트 빌더 역시 굉장히 많이 사용하는 패턴이다. 점층적 생성자 패턴과 자바빈즈 패턴은 요즘 코드에서 찾아볼 수 없다. lombok의 @Builder를 사용하여 쉽게 구현할 수 있으며, accessLevel 역시 조정할 수 있다. lombok의 @Builder를 이용해 빌더를 여러개 만들때 빌더 클래스와 메소드 이름을 적절히 조정해줄 필요가 있다. 그렇지 않으면, 오류가 날 수 있는데 빌더 클래스가 동일한 이름으로 2개 이상 존재하기 때문이다. 빌더 정적 팩토리 메소드(이하 정적 팩토리)와 생성자에는 똑같은 제약이 하나 있다. 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 이를 해결하기 위해서 점층적 생성자 패턴(telescoping constructor pattern)을 즐겨 사용했..

짧은 코멘트와 함께하는 이펙티브 자바) #1 생성자 대신 정적 팩토리 메소드를 고려하라

짧은 코멘트 개인적으로 굉장히 애용하는 정적 팩토리 메소드이다 ㅎㅎ lombok에서 @RequiredArgsConstructor 와 같은 어노테이션과 함께 staticName을 제공해주는데, 이는 자동으로 정적 팩토리 메소드를 만들어 주는 것이다. 이와 관련해 팀내 개발자 분들과 의견 교환을 해봤을때는 이를 사용하기는 애매하다는 의견이 다수였다. 꼭 필요한 필드들만 설정하거나 final을 쓰지 못할 이유가 있거나 등등의 어려움이 있기 때문이었다. 어떤 사람은 new Person() 보다 Person.of()가 깔끔해보인다는 이유로 정적 팩토리 메소드를 사용하는 경우도 있다. 나 역시 간혹 그럴 때가 있는데, 이보다 더 좋은 방법은 프로젝트를 구성하는 개발자들이 모여, 어떤 경우에 new를 이용한 객체 생..

Junit5 Parameterized Test 가이드

REF : https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests Parameterized Test와 관련된 공식 document를 번역+요약+개인 의견을 첨부하며 실제 타이핑해본 것을 정리한 포스트입니다...!! Parameterized Test란? 여러 argument를 이용해 테스트를 여러번 돌릴 수 있는 테스트를 할 수 있는 기능 사용하기 위해서는 @Test 대신 @ParameterizedTest 를 붙이면 된다. @ParameterizedTest를 사용하게 되면 최소 하나의 source 어노테이션을 붙여주어야 한다. 예를 들어, 다음 테스트는 배열로 argument를 전달하는 @ValueSorce이다 ..

Java OutputStream이란?

InputStream 링크 : lannstark.tistory.com/34 Java InputStream이란? InputStream OutputStream을 실무에서 사용할 때면, 뭔가 알긴 알고 실제로 둘을 활용해 기능을 구현하는데는 전혀 문제가 없지만, 사용할때마다 찾아보게되고 뭔가 정확히 아는 것 같지는 않다라는 느 lannstark.tistory.com OutputStream의 정의 OutputStream 추상 클래스는 데이터가 나가는 통로의 역할에 관해 규정하고 있는 추상 클래스이다. InputStream을 한 번 봤기 때문에 쉽게 이해할 수 있다.. 반대되는 개념이겠거니... OutputStream 주요 메소드 그럼 이제 데이터가 나가는 통로는 어떤 역할을 수행해야 하는지 주요 메소드를 알아보..

Java InputStream이란?

InputStream OutputStream을 실무에서 사용할 때면, 뭔가 알긴 알고 실제로 둘을 활용해 기능을 구현하는데는 전혀 문제가 없지만, 사용할때마다 찾아보게되고 뭔가 정확히 아는 것 같지는 않다라는 느낌적인 느낌이 있는 친구들이다. 그래서 이번 기회에 화끈하게 InputStream, OutputStream을 파보려고 한다. InputStream의 정의 JDK 11 기준 InputStream의 설명을 읽어보면 This abstract class is the superclass of all classes representing an input stream of bytes 라고 되어 있다. 중요한 부분은 "representing an input stream of bytes"이다. 하나씩 살펴보자. ..