토이 프로젝트 배우게 된 것들 & 오류 해결🐰 18

마이크로서비스에서 서비스간 통신 방법 차이

🤔 의문점 토이프로젝트를 진행하면서 서버 간 통신을 위해 RestTemplate과 Feign-Client 의 방식 중 어떤 방식을 선택하는게 좋을까에 대한 의문이 들었다. 실무에서는 두 방식을 모두 사용하지만, 두 방식에 대한 차이점을 정확히 인지하지 않고 어떤 프로젝트에서는 FeignClient 을 사용하고 있으면 동일하게 따라가고 어떤 프로젝트에서 RestTemplate를 사용하면 동일하게 따라가는 방식으로 코딩을 해왔던 것 같다. 아무래도 서비스 회사다 보니, 프로젝트를 처음부터 시작할 기회는 거의 없고 기존에 생성되어 있는 프로젝트에서 API를 추가가 대부분이어서 각각의 방식에 대해서는 인지하고 있었지만 어떤걸 택하면 좋을까? 라는 의문점은 들지 않았던 것 같다. 그래서 이번을 계기로 이 두 방식..

GeneratedType - 기본키 저장 전략 4가지

🏷 IDENTITY 전략 mysql에서 사용 기본키 생성을 데이터베이스에 위임한다. em.persist() 로 객체를 영속화 하는 시점에 insert query 가 db에 전송되고 여기서 반환되는 식별자 값을 가지고 1차 캐시에 저장한다. ❓em.persist() 에 대해서 좀 더 알아보자 보통 객체 생성 후, em.persist(Person) 을 사용하게 되면, 영속 상태 즉, 1차 캐시에 저장되게 된다. 이후, commit() 을 하기 전까지는, 쓰기 지연 sql 저장소에 보관되어 있다가, commit() 이 되면, 엔티티 매니저는 영속성 컨텍스트를 flush() 하게 된다. ✔️ 영속성 컨텍스트의 flush() 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화 하는 작업으로, 이때 등록, 수정, ..

hibernate db dialect 오류

위의 오류 사항을 분석해보기 전에! 하이버네이트가 무엇인지 알아보자 🏷 hibernate 하이버네이트는 자바 언어를 위한 객체 관계 매핑 프레임 워크로, 객체 지향 도메인 모델 > 관계형 데이터 베이스 맵핑 시, 사용한다. JPA 구현체 중 하나로 sql을 직접 사용하지 않고, 메서드 호출만으로 쿼리를 수행한다. 🏷 hibernate dialect 하이버네이트가 데이터베이스와 통신을 하기 위해 사용하는 언어를 의미한다. 모든 db는 각자의 고유한 언어가 있다. 관계형 DB에서는 형태, 문법이 어느정도 비슷하지만 완전히 똑같지는 않다. 하지만, 하이버네이트는 한 데이터베이스관리시스템(DBMS)에 국한되지 않고, 다양하게 사용 가능하다. JPA에서는 아래와 같이 Dialect라는 추상화된 언어 클래스를 제공..

H2 DB file is locked 발생 원인 및 해결 방법

프로젝트 구현 중, API를 만들기 전에, DB에 데이터가 어떻게 들어가는지 확인하고 싶어, 테스트를 진행 하였다. 테스트 코드 작성 후, 테스트 실행 시, 아래와 같은 오류가 발생했다. 🚨 오류 내용 thie file is locked 🤔 원인 위의 원인은 여러 프로세스에서 H2 DB에 동시에 접근할 때 발생하는 오류로, 저의 경우는 어플리케이션을 띄어놓고 Test를 돌릴 때 발생하였습니다. ✅ 해결 이럴 경우 DB url 뒤에 아래와 같이 AUTO_SERVER = true를 넣어주면 2개의 process에서 동시에 접근이 가능합니다!

final vs static final

final 키워드 final은 최종적인 이라는 의미를 가지고 있다. 즉, 해당 변수는 값이 저장되면 최종적인 값이 된다. 🏷 final 사용법 ✔️class 필드 안 final String name = "choi"; 클래스 필드 변수에 = 연산자를 사용하여 값을 넣어준다. ✔️ 생성자를 통해 public Class Users { final String name; public Users(String name) { this.name = name; } } 만약, 위의 코드에 static이 붙게 된다면, static final String name; // 컴파일 에러가 발생한다. 이유: static 키워드는 JVM 구동 시, 메모리에 올라가 있어야 하므로, 객체의 생성과 관계 없이 초기값이 할당 되어 있어야 하..

JPA 연관관계 총 정리

🏷 JPA에서 가장 중요한 것 JPA에서 가장 중요한 것을 뽑자면 객체와 관계형 데이터베이스 테이블을 어떻게 매핑되는지 이해하는 것이다. 왜냐하면 JPA의 목적인 "객체 지향 프로그래밍과 데이터베이스 사이의 패러다임 불일치를 해결" 이라는 것과 가장 직접적으로 연관되어 있기 때문이다. 객체와 테이블 매핑에 대한 내용을 조금 더 구체적으로 나누면 컬럼, 타입, 테이블, ... 등에 대한 1차적인 매핑과 테이블 간의 연관 관계 매핑으로 나눌 수 있다. 1차적인 매핑 @Entity, @Column, @Id, @GeneratedValue, @Enumerated .. 등의 말 그대로 객체와 데이터 베이스 사이의 1:1로 대응되는 것으로써, 기본적인 annotation을 숙지하고 필요한 경우에 찾아보는게 효율적이다..

Builder 패턴, @NoArgsConstructor, @AllArgsConstructor

프로젝트에 본격적으로 들어가기 전에 평소에 자주 썼던 어노테이션들에 대해 정확히 알고 쓰고 싶어서 정리를 해보았다. 실무를 할 때에도 @Builder 와 @NoArgsConstructor을 함께 쓰면 왜 안될까? 에 대해 깊숙히 알아보지 못해 지금 정리를 해보려고 한다! ☝🏻 일단 ! @Builder 패턴의 사용 이유를 알아보자! 🏷 빌더 패턴 사용 이유 1) 필요한 데이터만 설정할 수 있다. 2) 유연성을 확보할 수 있다. 예를들어, 어떠한 클래스에 필드가 추가되었다면 기존에 정의해놓았던 기본생성자에 수정이 필요해 진다. 하지만, builder 페턴을 사용하게 되면 수정 필요없이 해당 필드를 사용해야 하는 곳에 유연하게 추가가 가능하다. 3) 가독성을 높일 수 있다. 4) 변경 가능성을 최소화 할 수 ..

Spring Boot에서 H2 데이터베이스 연결

JPA에 대해 좀 더 깊이 있는 공부를 하고 싶어서 JPA를 활용한 프로젝트를 시작해보기로 결정했다. spring web project를 만들고 JPA 라이브러리, Lombok 라이브러리 등 프로젝트에 필요한 기본적인 라이브러리 의존성을 추가해줬다. 다음은 db 연결!! 1️⃣ dependency 추가 본인 프로젝트는 gradle 의존성 추가 Implementation 'com.h2database:h2' 2️⃣ application properties 추가 스프링 부트에서 DB 연결을 할 때는 application properties에 설정을 한다. H2 DB 또한 다른 DB들과 마찬가지로 application properties에 H2 DB의 설정 정보를 입력해야 JPA나 Mybatis에서 사용할 수 ..