Spring Boot 3.2.3.RELEASE가 아니라 Spring Framework 3.2.3.RELEASE로 개발된 프로젝트에서 개발 및 유지보수를 하면서 아래와 같은 코드를 반복적으로 보았다.TransactionStatus status = this.transactionManager_iqis.getTransaction(new DefaultTransactionDefinition());try{ //do something transactionManager_iqis.commit(status);} catch (Exception e) { transactionManager_iqis.rollback(status);} 주로 @Transactional로 사용하는 기능을 코드로 사용하고 있었다. 스프링 ..
Redis에 데이터를 직렬화/역직렬화 처리할 때 SerializationException이 발생 아래와 같이 직렬화, 역직렬화 대상이 되는 클래스에 LocalDateTimeSerializer, LocalDateTimeDeserializer를 각각 지정해서 직렬화, 역직렬화에 사용한다. @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) private LocalDateTime createdDate; @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateT..
JPA의 장점 객체에 적절한 책임을 할당하는 객체지향적 개발이 가능하다. 새로운 필드가 추가될 때마다 쿼리를 수정해야 하는 문제가 발생하지 않는다. 생성 방식 create: 기존 테이블 삭제 후 다시 생성 (개발) create-drop: create와 같으나 종료 시점에 테이블 drop (개발) update: 변경된 부분만 반영 (테스트, 개발) validate: entity와 table이 정상 매핑되었는지만 확인 (테스트, 운영) none: 사용하지 않음 (스테이징, 운영) 데이터베이스 스키마 생성 방식 설정 // application.properties spring.jpa.hibernate.ddl-auto={생성_방식} 스키마 자동 생성을 위한 Entity class 작성법 @Entity // (1)..
정적 팩토리 메소드란? 생성자를 통해 객체를 생성하는 것이 아닌 메서드를 통해 객체를 생성하는 것을 정적 팩토리 메서드라고 한다. 인스턴스 캐싱과 함께 사용하여 매번 새로운 인스턴스를 생성하지 않을 수 있다. 인스턴스 캐싱이란? 인스턴스를 미리 만들어 두고 필요할 때 사용함으로서 메모리 낭비를 해결하는 방법이다. public class LottoNumber { // 인스턴스 캐싱 private static final Map lottoNumbers = new HashMap(); // 1부터 45까지 LottoNumber 객체를 미리 생성한다. static { for (int number = LOTTO_START_NUMBER; number
디미터의 법칙(Law of Demeter) 상태를 가지는 객체의 데이터를 꺼내려 하지 말고 메세지를 보내라. 객체의 자료를 숨기고 함수를 공개함. 코드의 중복 사용 방지와 유지 보수성을 높일 수 있다. 결합도를 낮추고 응집도를 높일 수 있다. 디미터의 법칙을 위반한 경우 public class Lotto { private List LottoNumbers; public Lotto(List lottoNumbers) { LottoNumbers = lottoNumbers; } public List getLottoNumbers() { return LottoNumbers; } } @Test void 디미터의_법칙_위반() { List lottoNumbers = new ArrayList(Arrays.asList(1,..
리뷰어에게 코드 컨벤션을 지적받고 함께 받은 우아한테크코스 스타일 가이드를 읽어보았지만 사용 예시가 없어서 글로만 이해하기 힘들었다. 그리고 이때까지 함께 첨부된 intellij-java-wooteco-style.xml의 쓰임세에 대해 알지 못했다. 나는 사용 예시와 함께 정리된 글이 있지 않을까? 하고 검색했는데 IntelliJ에 Google Java Style Guide 적용하기 (feat. Naver)를 읽고 함께 첨부된 xml 파일의 용도를 알 수 있었다. 인텔리제이에서 자동 정렬(⌥ + ⌘ + L)을 사용하면 Wooteco Java Code Style로 자동 정렬 하도록 인텔리제이 설정을 바꿀 수 있다. IntelliJ에서 Wooteco Java Style Guide 사용하기 우아한테크코스 스타..
스레드(thread)란? 명령문이 순서대로 하나씩 처리되는 것. 즉, 프로그램의 실행 흐름. 멀티스레드 프로그램(multi-thread program)이란? 둘 이상의 실행 흐름을 갖는 프로그램. 멀티스레드 프로그램의 작동 방식 메인 스레드만 프로그램이 시작되면 자동으로 시작되고, 다른 스레드들은 메인 스레드에서 만들어서 시작한다. 메인 스레드가 끝나더라도 다른 스레드는 끝나지 않고 실행을 계속할 수 있다. 스레드는 동시에 실행되는 것이 아니라 자바 가상 머신이 스레드를 번갈아 실행한다. 멀티스레드 프로그램의 작성 방법 1. Thread 클래스를 이용하는 방법 class AlphabetThread extends Thread { public void run () { for (char ch = 'A'; ch
Exception 종류 RuntimeException이 checked exception과 unchecked exception을 나누는 기준으로서 RuntimeException과 서브 Exception은 모두 unchecked exception에 속하고 나머지는 모두 checked exception에 속한다. checked exception 반드시 try-catch 문으로 처리해야 하는 예외 예) IOException, FileNotFoundException unchecked exception 반드시 처리해야 할 필요가 없는 예외 예) RuntimeException, NullPointerException, ArithmeticException Exception 클래스의 메소드 getMessage() exce..
일급 컬렉션(First Class Collection) Wrapping한 Collection 외에 다른 멤버 변수가 없는 상태 특정 역할만을 수행하는 자료구조 // 기존 public class Racing { private List cars; } // 변경 public class Racing { private Cars car; } public class Cars {// List를 Cars 클래스로 Wrapping private List cars;//멤버 변수가 하나 밖에 없는 일급 컬렉션 public Cars(List cars){ this.cars = cars; } } 원시값, 문자열 포장 원시 타입 또는 문자열을 객체로 포장 // 기존 public class User { private String na..
String 클래스에 대한 학습 테스트 요구사항1 "1,2"을 , 로 split 했을 때 1과 2로 잘 분리되는지 확인하는 학습 테스트를 구현한다. "1"을 , 로 split 했을 때 1만을 포함하는 배열이 반환되는지에 대한 학습 테스트를 구현한다. @Test @DisplayName("요구사항1 - 1") void test1_1(){ String target = "1,2"; String[] temp = target.split(","); assertThat(temp).contains("1", "2"); } @Test @DisplayName("요구사항1 - 2") void test1_2(){ String target = "1"; String[] temp = target.split(","); assertTha..