EnumSet을 사용하는 방법 EnumSet은 다른 컬렉션들과 다르게 new 연산자 사용이 불가능합니다. EnumSet은 아래와 같은 방법으로 사용합니다. //DayOfWeek라는 Enum을 다루는 Set으로 비어있는 Set을 반환 EnumSet enumSet1 = EnumSet.noneOf(DayOfWeek.class); //모든 DayOfWeek Enum의 값을 담고있는 Set을 반환 EnumSet enumSet2 = EnumSet.allOf(DayOfWeek.class); 정적 팩토리 메소드(static factory method)만으로 EnumSet의 구현 객체를 반환받을 수 있습니다. 왜 이렇게 만든 걸까요? EnumSet 내부를 살펴보자 (아래 코드는 설명을 위해서 간소화한 코드입니다.) pu..
SQL 출력문을 반드시 확인하자. JPA에 익숙하지 않을때는 아무래도 구현하는 것에 더 집중하면서 실제 SQL 쿼리문이 어떤식으로 나오게 되는지 유심히 보지 못한 것이 사실이다. 이번 프로젝트에는 꼼꼼히 볼려고 노력해봤는데 SQL문을 확인해면 크게 2가지 문제가 있었다. 문제 1. 불필요한 Outer Join (optional 속성을 반드시 명시하자) 관계를 맞는 엔티티간의 관계가 반드시 존재하는지, 혹은 선택적인지에 따라 실제 두 테이블(도메인)을 조인하는 전략이 달라지는데, 만약 관계가 반드시 존재한다면 (= 테이블상의 FK가 반드시 존재한다면), optional 속성을 통해서 이를 명시해야한다. 그렇지 않다면 null인 경우도 대비해야 하기 떄문에 outer join이 발생한다. (+ 추가적으로 @..
Undefined? (null이랑 같은건가?) 자바스크립트에서는 (자바 같은 언어와 달리) 변수의 자료형을 별도로 표기하지 않고, 변수에 담기게 되는 값에 따라 자료형이 결정되게 됩니다. 이러한 특징때문에 undefined라는 상태를 다루게 되는데, 'undefined'라는 키워드는 해당 변수의 자료형이 정해지지 않았음을 나타냅니다. undefiend : 변수는 존재하나, 어떠한 값으로도 할당되지 않아 자료형이 정해지지(undefined) 않은 상태입니다. null : 변수는 존재하나, null 로 (값이) 할당된 상태. 즉 null은 자료형이 정해진(defined) 상태입니다. var var1; //undefined (어떤 값도 할당되지 않아서 자료형을 알 수 없음) var var2 = null; //..
동기(sync) vs 비동기(async), 블로킹 vs 논블로킹 사전적 의미는 일단 치워두고, 대조되는 개념들을 어떤 관점으로 봐야하는지 짧게 설명해보겠습니다. 동기 vs 비동기 : 처리해야 할 작업들을 어떠한 '흐름'으로 처리 할 것인가에 대한 관점 블로킹 vs 논블로킹 : 처리되어야 하는 (하나의) 작업이, 전체적인 작업 '흐름'을 막느냐 안막느냐에 대한 관점 이제 동기 vs 비동기, 블로킹 vs 논블로킹을 예제로 쉽게 설명해보겠습니다. 등장인물 개발팀장 : 개발팀 작업의 흐름을 조율하고, 개발팀 사원들에게 업무를 지시한다. 사원1, 사원2, 사원3 : 개발팀장이 지시한 일을 성실하게 수행한다. 시나리오1 (비동기 + 논블로킹) 개발팀장이 사원1에게 업무A를, 사원2에게 업무B를, 사원3에게 업무C를..
스프링 프레임워크에서 하나의 인터페이스 (혹은 상위 클래스)를 구현(상속)한 여러개의 빈이 존재하고, 그 빈들을 모두 다뤄야 하는 경우에 예제를 보겠습니다. 예제로 사용할 빈들은 다음과 같습니다. public interface Music { void playing(); } @Component public class Music1 implements Music{ @Override public void playing() { System.out.println("뮤직1의 흥겨운 노래"); } } @Component public class Music2 implements Music{ @Override public void playing() { System.out.println("뮤직2의 즐거운 노래"); } } @..
스프링 부트(Spring Boot)에서 컨트롤러(Controller)를 테스트 하는 방법에 대해서 기록해보겠습니다. 컨트롤러 테스트를 쉽게 하기 위해서 요청을 수행하고 응답을 만들어내는 Servlet API 모조(mock)객체를 사용합니다. 테스트에 사용되는 객체가 여러가지 존재하지만 대표적으로 MockMvc를 많이 사용합니다. (그리고 컨트롤러를 테스트 한다는 표현보다는 MVC를 테스트 한다는 표현을 주로 사용합니다.) 부트버전은 2.1.6을 사용했으며, Spring Web Starter이외에 별다른 의존 설정은 하지 않았습니다. (Spring Web Starter만 추가하면 아래와 같이 2가지 의존설정이 들어갑니다.) org.springframework.boot spring-boot-starter-w..
개요 Collection의 List나 Map은 모두 get()메소드로 저장되어진 인스턴스를 가져올 수 있지만 Set만 get메소드가 존재하지 않습니다. 왤까요..? 1. Set의 본래 사용 목적과 맞지 않는다. Set은 순서와 상관없이 중복되지 않는 데이터를 저장하는 것을 목적으로 만들어진 자료구조입니다. 순서를 보장하지 않기 때문에 List 처럼 인덱스 값을 가질 수 없습니다. 대신 중복을 허용하지 않기 때문에 해당 데이터가 저장되어 있는지 아닌지를 빠르게 확인하는 contains() 메소드를 가질 수 있습니다. (List도 contains() 메소드를 가지고 있기는 하지만 모든 데이터를 순회하면서 탐색하여 성능이 좋지 않습니다.) 2. 구조적으로 구현이 불가능하다. Set의 구현체들을 살펴보면 흥미로..
이 포스팅은 개인적, 주관적 해석이 듬뿍 들어가있습니다. TDD(Test-Driven-Development)란? TDD 창시자 켄트 백이 TDD라는 용어를 만들기 전에 먼저 고려 했던 키워드는 TFP (Test-First-Programming)입니다. 말 그대로 테스트 코드를 먼저 만들고, 실제 프로덕션 코드를 나중에 만드는 개발 방법을 말합니다. 그래서 TDD와 상반되는 개념으로 테스트 코드를 나중에 작성하는 방식을 TLP(Test-Last-Programming) 혹은 TLD(Test-Last-Development)라고 합니다. TDD없이 개발할 때 종종 겪는 개발 시나리오 프로덕션 코드 A 만들기. 코드A의 테스트 코드 작성하기. (테스트는 당연히 통과된다. 작성된 프로덕션 코드에 끼어맞춰서 테스트 ..