![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/vLvVP/btqPTCXtcXJ/FCk6JdpwqMSgeiHkAKIwW0/img.png)
1. 불필요한 객체 생성이란? 어떤 객체의 생성이 잦고 그 객체의 생성 비용이 높다면, 하나의 객체를 재사용하는 편이 좋다. 불필요한 객체 생성을 하지 않고 자원을 아낄 수 있기 때문이다. 특히, 불변 객체는 언제든 안심하고 재사용할 수 있다. 불변 객체는 인스턴스가 생성되면 그 상태를 변경할 수 없는 객체를 말한다. 객체의 상태가 변하지 않기 때문에 일관된 인스턴스를 공유해 재사용할 수 있다. 불변 객체에서 같은 값을 가지는 인스턴스가 한 개 이상 생성된다면, 그것은 불필요한 객체 생성이라 할 수 있다. 2. String을 통한 예시 대표적인 불변 클래스인 String을 통해 불필요한 객체 생성에 대한 예를 더욱 쉽게 이해할 수 있다. String a = new String("Effective"); 위..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cNbtn0/btqN02bf73F/8iwYvdpjqRPcHK38SE8Zf0/img.png)
Java의 객체지향은 많은 클래스가 하나 이상의 자원에 의존하게 된다. 이때 의존성을 코드에 명시할 경우 의존성이 클라이언트 코드에 강하게 결합되어 유연하지 않고 테스트하기 어려워진다. 자원을 코드에 직접 명시할 경우 문제점 다음과 같이 정적 유틸로 만들어진 결제 머신 클래스가 있다고 생각해보자. public class PaymentMachine { private static final Pay pay = new KakaoPay(); private PaymentMachine() { } // 생성자 방어 public static Payment payment() { /* 구현 */ } } 이 결제 머신은 카카오페이로 결제할 때 아주 잘 동작한다. 카카오페이를 직접적으로 의존하여 카카오 페이라는 자원을 가지고 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/chQZMS/btqNqdMs6ni/kqnpgXKbamXGYxUep6Bqr0/img.png)
정적 메서드, 정적 필드를 가지는 유틸리티 클래스 개발을 하다 보면 유틸리티 클래스가 필요한 경우가 있다. 이러한 도구용 클래스는 단순히 정적 메서드와 정적 필드만을 담은 클래스로써 객체 지향과는 거리가 멀지만 분명 쓸모가 있다. 예시로는 java.lang.Math와 java.util.Arrays가 있다. Math 클래스는 계산과 관련된 정적 메서드와 상수들을 담고 있고, Arrays 클래스는 배열과 관련된 정적 메서드를 담고 있다. 이러한 유틸리티 클래스는 인스턴스화를 위해 설계된 클래스가 아니기 때문에 두 클래스 모두 private 생성자를 가지는 것을 볼 수 있다. private 기본 생성자를 명시하는 이유 그렇다면 왜 기본 생성자를 private으로 명시해주는 것일까? 그 이유는 생성자를 명시하지..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bvvprv/btqNr7xlOXb/kw52PpolAP0iAw7dFGqoSK/img.png)
싱글턴? 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴을 만드는 두 가지 방법 1. 인스턴스를 public static final 필드로 만들고 private으로 생성자를 방어 private 생성자는 Singleton.INSTANCE가 초기화될 때 딱 한 번만 호출된다. public이나 protected 생성자가 없기 때문에 초기화될 때 만들어진 인스턴스가 전체 시스템에서 하나뿐임을 보장한다. 장점 : 간결하기 때문에 누가봐도 싱글턴 클래스임을 한눈에 알아볼 수 있다. 단, 리플렉션 API를 사용하면 private 생성자를 호출할 수 있어 새로운 인스턴스를 생성할 수 있다. 이를 해결하기 위해서는 생성자에서 두 번째 객체가 생성될 때 예외를 던지면 된다. 2. 정적 팩터리 메..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/FaS1v/btqMNwFlZ1P/oRYsHd27TOX73ZbO1vFSLk/img.png)
정적 팩터리 메서드와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다. 이러한 제약에 대안으로 프로그래머들은 다음과 같은 방법을 사용했다. 점층적 생성자 패턴 자바 빈즈 패턴 빌더 패턴 1. 점층적 생성자 패턴 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 2개 받는 생성자 ....... 선택 매개변수를 전부 다 받는 생성자까지 점층적으로 늘려가는 방식이다. public class NutritionFacts { private final int servingSize; // (mL, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/A2L5M/btqLYNUtZyS/NK4LPooEgPK61Vd19ta6BK/img.png)
정적 팩터리 메서드의 장점 1. 이름을 가질 수 있다. 하나의 시그니처로는 생성자를 하나만 만들 수 있기 때문에 생성자에 넘기는 매개변수와 생성자 자체만으로 반환될 객체의 특성을 제대로 설명할 수 없다. 하지만 정적 팩터리 메서드는 이러한 제약이 없다. 시그니처가 같은 생성자가 여러 개 필요할 것 같으면 각각 차이를 잘 드러내는 이름을 지어주어 반환 객체의 특성을 쉽게 묘사할 수 있다. 예를 들면, 이름을 가진 정적 팩터리 메서드가 소수인 BigInteger를 반환한다는 의미를 더 잘 나타내고 있다. 위의 예시를 통해 이름을 가지는 정적 팩터리 메서드의 장점을 한눈에 확인할 수 있다. 2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다. 불변 클래스 인스턴스를 미리 만들어 놓거나 인스턴스 캐싱으로 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bm9gKE/btqFIjfg9Zn/MieRIJPgNf8Ubb7zKP7JIk/img.png)
어떤 요청에 대한 응답으로 JSON을 많이 이용하고 있다. 이때 필요한 Data만 전달받는 DTO를 만들고 적용해보자. (카카오톡 챗봇 예제를 이용해 진행했습니다.) 1. 역직렬화(Deserialize)란? byte로 변환된 Data를 원래대로 변환하는 기술을 역직렬화(Deserialize)라고 부른다. Json → Java Object 변환 2. 예제 카카오 챗봇에서는 요청과 응답을 JSON Data로 주고 받는다. 전달된 JSON Data를 통해 사용자를 식별하거나, 사용자가 원하는 동작을 파악할 수 있고 데이터를 컨트롤할 수 있게 된다. 하지만 내가 사용하고자 하는 정보가 명확히 정해져 있고 한정적이라면 보내지는 JSON Data를 모두 받아 처리할 필요가 없다. 예를 들면, { "intent": ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/FPM4w/btqFA6zLVhm/xCqZTHX6a6n4xzS0bOExX0/img.png)
인증, 인가, 권한, 로그인 등의 기능을 제공해주는 Spring Security를 학습하고 적용해보자. 1. Spring Security 개념 스프링 시큐리티는 스프링 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다. 보안과 관련해서 체계적으로 많은 옵션을 제공 일일이 보안 관련 로직을 작성하지 않아도 됨 1. Spring Security 용어 접근 주체 (Principal) 보호된 리소스에 접근하는 유저 인증 (Authentication) 현재 유저가 누구인지 확인한다. ex) Form Login 애플리케이션의 작업을 수행할 수 있는 주체임을 확인하는 과정 인가 (Authorization) 현재 유저가 리소스에 접근할 수 있는 권한이 있는지 검사하는 과정 인증(..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cVBzMk/btqFztiDpb5/jGQazBKjlkQ060YWbKNZL0/img.png)
1. JUnit5 - Assertion JUnit Jupiter는 다양한 Assertion 메서드가 포함되어있다. Assertion 클래스를 살펴보면 메서드는 모두 static 메서드이고, 오버로딩을 통해 다양한 타입을 지원하고 있다. 다양한 Assertion 메서드를 살펴보자. assertEqulas(expected, actual) 실제 값이 기대한 값과 같은지 확인 assertNotNull(actual) 실제 값이 null이 아닌지 확인 assertTrue(boolean) 다음 조건이 True인지 확인 assertAll(executables) 모든 구문을 확인 functional Interface인 excutables 타입을 매개변수로 받는다. assertThrows(expectedType, exec..