본문 바로가기

전체 글

(52)
[item6] 불필요한 객체 생성을 피해라 재사용은 성능을 향상시킬 수 있는 좋은 방법이다. 성능을 향상시킬 수 있는 가장 좋은 방법은 캐싱이다. 이미 처리된 결과를 저장해놓고 같은 요청이 들어오면 요청하지 않고 처리된 결과를 즉시 반환해주는 방식, 즉 캐싱을 통해 성능을 향상시킬 수 있다. java도 마찬가지 이다. 같은 기능을 하는 객체라면 여러개를 생성하는 것보다 이미 만들어놓은 객체를 재사용하는 것이 더 편리하다. String 과 new String() 면접 질문으로도 자주 나오는 질문으로 "(큰따옴표) 를 이용해 String를 생성하는 것과 생성자를 통해 만드는 String의 차이를 물어보는 질문이다. 이 질문에 대한 답은 재사용여부이다. "(큰따옴표)로 만든 String객체들은 JVM이 String Pool이라는 별도의 영역에 관리하고..
[item5] 자원을 직접 명시하기 보단 의존 객체 주입을 사용하라. DI DI의 이점은 외부로부터 필요한 객체를 주입 받아서 사용하는 방법이다. 필요한 자원을 객체가 스스로 만들지 말고 외부에서 주입받아서 사용하는 방법이다. DI의 특징은 이전에 쓴 Spring블로그에서도 나왔으므로 테스트 코드를 작성하기 용이해진다는 방법으로 접근해보겠다. DI는 자원에 따라 동작하는 방식을 다르게 만들 수 있다. 자원에 따라 동작하는 방식을 다르게 만들 수 있기에 테스트 코드의 작성이 유리해진다. 같은 인터페이스를 사용한다면 동일한 인터페이스를 구체화한 어떤 객체라도 사용이 가능하다. 즉 테스트를 위한 전용 객체를 만들어서 테스트를 용이하게 작성할 수 있다. 아래의 코드를 테스트를 해보겠다. public class MyFileReader { private BufferedReader r..
[item4] 인스턴스화를 막기 위해서는 private 생성자를 사용해라. 모든 클래스가 객체로 만들어질 필요는 없다. 클래스가 객체로서 만들어져 사용되는 목적이 아니라 클래스 1개가 유틸리티들의 묶음으로서의 역할로 수행하는 경우가 있다. java 내장 클래스로는 Collections, Arrays , Math 등이 있다. Math의 코드를 일부 발췌하면 다음과 같이 작성되어 있다. public final class Math { /** * Don't let anyone instantiate this class. */ private Math() {} // 생략.... } private 생성자를 만들어놓고 주석으로 아무나 이 클래스를 인스턴스화하지 말라 고 경고도 해준다. 단순히 private 생성자를 만들어놓고 공란으로 만들 수도 있으나 문제가 있다. 외부가 아니면 내부에서 호출..
[item3] 싱글톤을 만들 시 private 생성자나 enum type으로 구현해라. 이 item의 내용들은 java를 싱글톤으로 만드는 좋은 방법에 대한 제안이다. 싱글톤 패턴이란 싱글톤은 오직 1개의 인스턴스를 여러 객체가 공유하여 사용하는 패턴이다. 이 패턴은 자원을 많이 사용하는 객체일 경우 하나의 단일 인스턴스를 만들어 공유하므로서 자원을 아끼기 위해 사용한다. 싱글톤 인스턴스는 단일 스레드를 이용할 때는 구현이 쉬우나 멀티 스레드 환경에서는 어려워질 수 있다. 1. private 생성자를 통한 단일 인스턴스 관리 private 생성자로 인스턴스를 막아놓고 정적 팩토리 메소드를 통해 인스턴스로 접근하는 방법이다. public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Si..
[item2] 생성자에 매개변수가 많다면 빌더 패턴을 고려해라 매개변수가 많으면 발생하는 문제점 코드를 작성하다보면 어쩔 수 없이 매개변수가 많은 객체를 만들어야 하는 상황이 있을 때도 있다. 이럴 때 생성자나 정적 팩토리 메소드로 매개변수를 사용하는 방법은 매개변수의 순서를 기억하기 어렵고 일부가 누락될 수 있는 문제점이 있다. 이 문제를 해결하기 위해 매개변수가 많은 객체를 생성할 때는 빌더 패턴을 이용해 매개변수의 누락을 방지하도록 할 수 있다. 기존의 생성자를 이용한 인스턴스 생성 생성자를 통해 만들려면 다음과 같은 코드를 이용한다. public class Person { private final String name; private final int age; private final String address; private final String phon..
[item1] 생성자 대신 정적 팩토리 메소드를 고려해라 정적 팩토리 메소드란 정적 팩토리 메소드는 정적으로 생성한 팩토리 메소드로서 객체를 대신 생성해주는 역할을 가진다. 팩토리 메소드라고 이름이 붙이니 GoF의 팩토리 메소드 패턴과 동일하다고 생각할 수 있으나 이들은 다르며 다음의 차이가 있다. 팩토리 메소드: 팩토리 객체에게 생성에 필요한 인자들을 넘겨주어 객체를 반환한다. 정적 팩토리 메소드: static 메소드(정적 팩토리)가 생성자 역할을 대행해준다. 정적 팩토리 없이 객체를 생성하면 new 키워드를 통해 생성하게 된다. // 사용법: Car car=new Car("Hyundai", "Sonata", 2022) public class Car { private String make; private String model; private int year..
[JPA] Persistence Context JPA JPA는 Java Persistence API로서 Java에서 표준으로 제공하는 추상화된 형식이다. JPA은 구현체가 아닌 추상화된 내용들이다. java에서 'ORM을 사용할려면 이러한 조건들을 모두 만족해야 해' 라고 가이드를 해준 내용이 JPA이다. 즉 JPA만으로는 ORM을 완전히 사용할 수 없다. 추상화된 JPA 규격을 기반으로 구현한 구현체가 있어야 작동한다. 대표적인 JPA 구현체는 Hibernate, OpenJPA, EclipseLink가 있다. 이처럼 언어가 JPA라는 규격을 정해놓고 이 서비스를 제공할 Service Provider들이 만들어진 규격을 기반으로 구현체를 만든다. 2019년에 Java Persistence는 Jakarta Persistence로 명칭이 변경되었다. 그..
[TDD] 좋은 테스트를 작성하기 위한 원칙들 테스트 유닛을 잘 작성하는 방법론들은 많다. 이들에 대한 정리를 하다보면 테스트를 어떻게 작성해야 할 것인지 감을 잡을 수 있을 것 같아서 정리해본다. FIRST Fast: 테스트 유닛은 빨라야 한다. 테스트라는 작업을 개발중에 자주 실행되는 작업이기 때문에 테스트의 실행 속도는 빨라야 한다. Independent(Isolated): 테스트 유닛의 실행은 독립적이어야 한다. 테스트 유닛 하나의 결과가 다른 테스트 유닛들에게 전파되어서는 안된다. I에 해당되는 내용은 Independent로 적시한 글도 있고 Isolated도 적시한 글도 있다. 이들의 사용한 의미는 동일하기에 필자는 둘 다 맞다고 생각한다. Repeatable: 테스트 유닛은 반복적으로 실행 가능해야 한다. 즉 네트워크, OS 등 외부 환..