JPA 사용 시 주의할 점 영속 상태 보장 JPA Entity는 영속상태인가, 아닌가에 따라서 동작 상 제한사항이 있을 수 있다. 예를 들면, 영속 상태의 entity는 delete가 가능하지만 비영속 상태의 entity는 불가능하다. 특정 로직을 수행하는 경우 영속 상태를 인지하고 있어야한다. @Transactional public void deleteQuestion(User loginUser, Question question) throws CannotDeleteException { if (question.isDeleted()) { throw new CannotDeleteException("이미 삭제된 질문입니다."); } if (!question.isOwner(loginUser)) { throw ne..
Java
ATDD 같이 읽을 만한 자료 https://en.wikipedia.org/wiki/Acceptance_test–driven_development https://martinfowler.com/articles/practical-test-pyramid.html ATDD를 간단하게 소개해보자면... 인수 테스트는 고객과 개발자, 그리고 테스터간의 커뮤니케이션을 기반으로 한 개발 방법론이다. 이러한 프로세스는 개발자와 테스터가 구현 전에 고객의 요구를 이해하는 데 도움이 되며 고객이 자신의 도메인 언어로 대화 할 수 있도록 한다. Trade off of TDD 테스트 케이스가 없는 코드는 깨끗한 코드가 아니다. 아무리 코드가 우아해도, 아무리 가독성이 높아도, 테스트 케이스가 없으면 깨끗하지 않다. 테스트는 코..
일급 콜렉션 일급 콜렉션은 콜렉션 외의 필드가 존재하지 않는 클래스를 의미한다. 왜 사용하는가 콜렉션을 필드로 사용하는 도메인 객체는 데이터 일관성에 관한 문제가 생길 가능성이 존재한다. 다음의 예시를 살펴보자. @AllArgsConstructor public class Order { private final long orderId; private final String name; private final List orderTimes; } public void order() { List orderTimes = new ArrayList(); orderTimes.add(LocalDateTime.now()); orderTimes.add(LocalDateTime.now()); Order order = new O..
멱등성과 테스트의 관계 메소드 내부에서 사용하기만 해도 테스트가 어려워지는 유형의 코드가 있다. 다음의 예제를 살펴보자. public class DifficultTest { public int nextLottoNumber() { Random random = new Random(); return random.nextInt(45) + 1; } public String todayDateToString() { return LocalDateTime.now().toString(); } public String inputIntToString() { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int b = scanner.nextInt();..
스트림 생성 다양한 방식으로 스트림을 생성할 수 있다. 빈 스트림 생성 Stream::empty 는 빈 스트림을 생성한다. Stream emptyStream = Stream.empty(); 매개변수를 사용한 생성 Stream::of 는 매개변수 목록을 받고 Arrays.stream 을 반환하여 스트림을 생성한다. Stream cityNamesStream = Stream.of("Seoul", "Incheon", "Ulsan", "Daegu", "Gwangju", "Busan"); null이 될 수도 있는 객체를 스트림화 Java 9 이상에서 추가된 Stream.ofNullable 은 매개변수의 값이 null이 아니면 스트림을 생성한다. null인 경우 Stream.empty 를 반환하여 빈 스트림을 생성한..
기본 자료형 스트림 이번 포스트에서도 아래의 예시 데이터를 사용한다. @Getter @AllArgsConstructor @EqualsAndHashCode public class City { private String name; private double area; private int population; private String areaCode; } List cities = Arrays.asList( new City("Seoul", 605.2, 9720846, "02"), new City("Incheon", 1063.3, 2947217, "032"), new City("Ulsan", 1062, 1142190, "052"), new City("Daegu", 883.5, 2427954, "053"), n..
스트림 주요 메소드 이번 포스팅에서는 스트림 활용 시 주로 사용되는 메소드를 다룬다. 지난 포스팅과 비슷한 예제로 진행하였다. @Getter @AllArgsConstructor @EqualsAndHashCode // equals, hashcode 자동 생성 public class City { private String name; private double area; private int population; private String areaCode; } List cities = Arrays.asList( new City("Seoul", 605.2, 9720846, "02"), new City("Incheon", 1063.3, 2947217, "032"), new City("Ulsan", 1062, 11..
스트림 자바 언어 설계자들은 개발자의 시간을 절약해주면서도 쉽고 빠르게 코드를 작성할 수 있는 스트림이라는 기능을 추가했다. 아주 쉬운 예시를 통해 스트림의 특징을 파악해본다. 사용할 데이터 컬렉션과 스트림의 차이를 예시로 나타내기 위해 사용할 데이터를 만들었다. 유형을 City 클래스로 정의하고 대한민국의 광역시 목록을 cities에 저장하였다. City @Getter @AllArgsConstructor public class City { private String name; private double area; // 면적 private int population; // 인구 private String areaCode; // 지역 번호 } cities List cities = Arrays.asList(..