일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Effetive Java
- @SpyBean
- springboot
- Item04
- @ControllerAdvice
- deleteById
- multi module
- NotEmpty
- 이펙티브 자바
- restTemplate
- Service Locator 패턴
- Service Locator
- Effective Java
- @Valid
- SQL 삽입 공격
- Proxy Patter
- Spring Boot
- Firebase
- NotBlank
- FCM
- 트랜잭션
- db
- @MockBean
- Connection Pool
- 디자인 패턴
- JPA
- 플라이웨이트
- Web
- 데이터베이스
- java
- Today
- Total
목록분류 전체보기 (64)
NoTimeForDawdling
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/VOcBX/btq7U1xk9Dl/ME7syuTpmu5w549TKAMXD1/img.png)
Spring Boot를 사용할 때 Junit을 이용해 테스트 코드를 작성하다 보면 보통 여러 레파지토리와 비즈니스 로직이 함께 있어 테스트 환경을 설정하는데 많은 시간을 사용하고 테스트 대상에 집중하는데 어려움을 느낄 수 있습니다. 이러한 문제를 해결하기 위해 테스트 더블 이라는 것이 나왔습니다. 테스트 더블은 목적에 따라 비슷하면서도 다른 객체를 사용하는 모든 행위를 말합니다. Java에서는 대표적으로 Mockito가 있습니다. Mockito에는 다양한 어노테이션이 있는데 이중에서 @MockBean과 @SpyBean에 대해 알아보겠습니다. @MockBean @MockBean은 기존에 사용되던 Bean의 껍데기만 가져오고 내부 구현은 모두 사용자에게 위임하는 형태입니다. 즉, 해당 Bean의 어떤 메서드..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cdzqSM/btq7ucUkIJQ/twkiVrQaFLk29NKdkkzHSK/img.png)
이벤트 사용방법을 알아보기 전에 이벤트에 대해 간단히 알아보자. 이벤트(Event)란? 이벤트는 '과거에 벌어진 어떤 것'을 뜻한다. 예로, 주문을 취소했다면 '주문을 취소했음 이벤트'가 발생했다고 할 수 있다. 이벤트가 발생한다는 것은 상태가 변경됐다는 것을 의미한다. 즉, '주문 취소 이벤트'가 발생한 이유는 주문이 취소 상태로 바뀌었기 때문이다. 이벤트가 발생하면 그 이벤트에 반응하여 원하는 동작을 수행하는 기능을 구현하면 된다. 이벤트 필요성 강결합 문제 어느 쇼핑몰에서 구매를 취소하면 환불을 처리해야 한다. 이때 주문을 취소하는 로직과 환불을 위한 로직이 모두 섞이게 된다. 이렇게 서로 강한 결합으로 묶여있으면 코드도 복잡해지고, 나중에 유지보수가 힘들어질 수 있다. 트랜잭션 처리 문제 환불 기..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/sn0Se/btq66kFadru/gLofketUMc5H0KuT6qVFzk/img.png)
강한 참조(Strong Reference) 강한 참조는 Java의 기본 참조 유형으로 new를 통해 객체를 생성할 때 생기게 되는 참조다. 강함 참조를 통해 참조되고 있는 객체는 참조가 해제되지 않는 이상 가비지 컬렉션의 대상에서 제외된다. 약한 참조(Weak Reference) 약한 참조는 java의 lang 패키지의 WeakReference 클래스를 사용하여 생성한다. 약한 참조는 GC가 발생하면 무조건 수거된다. WeakReference가 사라지는 시점이 GC의 실행 주기와 일치한다. Soft Reference Soft 참조는 강한 참조와 약한 참조와는 다르게 GC에 의해 수거될 수도 있고, 수거되지 않을 수도 있다. 메모리에 충분한 여유가 있다면 GC가 수행된다 하더라도 수거되지 않는다. 하지만 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bhHF6T/btq64Saao66/4e91cmDExRru9KKxzQW2b0/img.png)
프록시 패턴(Proxy Patter) 이란? 어떤 객체를 사용하고자 할 때, 객체를 직접적으로 참조하는 것이 아니라, 그 객체를 대행(대리, proxy)하는 객체를 통해 대상 객체에 접근하는 방식을 말한다. 즉, 실제 기능을 수행하는 객체(Real Object)대신 가상의 객체(Proxy Object)를 사용해 로직의 흐름을 제어하는 디자인 패턴이다. 프록시 패턴 특징 및 장점 실제 대상 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있다. 실제 객체의 기능이 반드시 필요한 시점까지 객체의 생성을 미룰 수 있다. 프록시 객체와 실제 객체는 같은 인터페이스를 구현하여 프록시 객체는 실제 객체와 치환이 가능하다. 사용자 입장에서는 프록시 객체와 실제 객체의 사용법이 유사하므로 사용성이..
GC는 다 쓴 객체를 알아서 회수해 가기 때문에 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 오해할 수 있다. GC가 처리할 수 없는 자원이 생기지 않게 주의해야 한다. 메모리 직접 관리 예제 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { this.elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { this.ensureCapacity(); this.elements[size++] = e; } public O..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/L2iWm/btq6uIzIbGo/kmLnKzVRBCghrjtXJiH5k1/img.png)
상태 패턴이란? 상태 패턴은 한 객체에게 여러 개의 상태(State)가 존재하고, 상태간에 긴밀한 연결성이 있을 경우 상태간의 전이를 용이하게 해주는 패턴이다. 상태 패턴에서 객체는 최초의 상태객체를 입력받고, 외부 입력에 따라 다른 상태객체로 변경되는데, 이때 두 번째 상태객체는 첫 번째 상태객체가 생성한다. 전략패턴이 여러 개의 전략객체를 상황에 따라 주체객체에 직접 연결하는 것과 달리, 상태 패턴에서는 상태객체가 다음 상태객체를 생성하고, 현재 상태객체로 설정한다. 예를 들어 핸드폰에 세가지 상태가 있다고 가정해보자. 전원 OFF 전원 ON, 화면 ON 전원 ON, 화면 OFF 핸드폰에 전원 버튼이 있는데 이걸 누를 때 다음과 같은 상태의 변이가 일어나게 된다. 전원이 OFF일 때 전원 버튼을 누르..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/m7j78/btq5GdueSpO/DWyQThFho4YuM0MUSpNOV1/img.png)
똑같은 기능의 객체를 매번 생성하는 것 보다 객체 하나를 재사용하는 편이 나을 때가 많습니다. 만약 똑같은 기능의 객체를 매번 생성하게 된다면 쓸데없는 인스턴스가 수백만 개 만들어 질 수 있고, 이는 GC의 대상이 될 수 있습니다. 정적 팩토리 메서드 Boolean(String) 생성자 대신 Boolean.valueOf(String) 팩토리 메서드를 사용하는 것이 좋습니다. 생성자는 호출할 때마다 새로운 객체를 만들지만, 팩토리 메서드는 그렇지 않습니다. boolean bad = new Boolean("TRUE"); // 생성자 호출 boolean good = Boolean.valueOf("TRUE"); // 팩토리 메서드 사용 생성비용이 비싼 객체 생성 비용이 '비싼 객체'가 반복해서 필요하다면 캐싱하..
많은 클래스는 하나 이상의 자원에 의존합니다. 하나의 자원에 의존한다면 정적 유틸리티 클래스나, 싱글톤 방식을 써도 괜찮을 수 있습니다. 하지만 사용하는 자원에 따라 동작이 달라지는 클래스라면 정적 유틸리티 클래스나 싱글톤 방식이 적합하지 않습니다. 정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private static final Lexicon dictionary = new Lexicon(); // 특정 자원 명시 private SpellChecker() {} // 인스턴스화 방지 public static boolean isValid(String word) {...} public static List suggestions(String typo) {...} } 싱글톤을..