분류 전체보기 45

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에서 동시에 접근이 가능합니다!

Chapter 06. 객체 지향 프로그래밍 - 2

🏷 인스턴스 멤버 필드와 메소드는 선언 방법에 따라 인스턴스 멤버와 정적 멤버로 분류 할 수 있다. 인스턴스 멤버 객체에 소속된 멤버 - 객체를 생성해야지만 사용할 수 있는 멤버 정적 멤버 클래스에 고정된 멤버 = 객체 없이도 사용할 수 있는 멤버 ✔️ 인스턴스 멤버 선언 및 사용 필드와 메소드는 인스턴스 멤버이기 때문에 외부 클래스에서 사용하기 위해서는 Car 객체를 먼저 생성하고 참조 변수로 접근해서 사용해야 한다. Car myCar = new Car(); myCar gas = 10; myCar.setSpeed(60); Car yourCar = new Car(); yourCar gas = 20; yourCar.setSpeed(70); 위와 같이 인스턴스를 생성했을 때, gas 필드는 각각의 인스턴스 ..

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) 변경 가능성을 최소화 할 수 ..

Chapter 06. 객체 지향 프로그래밍 - 1

소프트웨어를 개발할 때에도 부품에 해당하는 객체들을 먼저 만들고, 이 객체들을 하나씩 조합하여 완성된 프로그램을 만드는 기법을 말한다. 🏷 객체란? 객체는 필드와 메소드로 구성되어 있다. 객체 모델링 현실 세계의 객체를 소프트웨어 객체로 설계하는 것을 의미한다. 현실 세계 객체의 대표 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메소드로 정의하는 과정이라고 볼 수 있다. 🏷 객체의 상호작용 객체 지향 프로그램에서도 객체들은 서로 상호작용으로 동작한다. 객체들 사이의 상호작용 수단은 메소드이다. 객체가 다른 객체의 기능을 이용할 때 이 메소드를 호출한다. 메소드 호출을 통해 객체들은 데이터를 서로 주고받는다. 🏷 객체 간의 관계 객체는 단독으로 존재할 수 있지만, 대부분 다른 객체와 관계를 맺고 있다...

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에서 사용할 수 ..

Chapter 05. 참조 타입

5.1 데이터 타입 분류 자바의 타입 기본 타입 : 정수, 실수, 논리 타입 참조 타입 : 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스. 인터페이스 타입이 있다. 더보기 객체란 ? 객체는 데이터와 메소드로 구성된 덩어리 객체 = 데이터(필드) + 메소드 기본 타입 vs 참조 타입 기본 타입은 값을 저장할 때, 값 자체를 저장하지만, 참조 타입은 객체가 생성된 메모리 번지를 저장한다. 메모리 상에서 변수들이 갖는 값 변수들은 모두 stack 이라는 메모리 영역에 생성된다. 기본 타입인 price와 age는 직접 값을 저장하고 있지만, 참조 타입 변수인 name과 hobby는 번지를 저장하고 해당 번지를 통해 String 객체를 참조한다. 5.2 메모리 사용 영역 자바에서 사용하는 메모리 영역에 대..

Chapter 04. 조건문과 반복문

4.2 if 문 if 문은 조건식의 결과에 따라 블록 실행 여부가 결정된다. 조건식에는 true 또는 false 값을 산출할 수 있는 연산식이나 boolean 변수가 올 수 있다. 중괄호 {} 를 생략할 수 있는데 생략하지 않고 그냥 쓰는 것이 더 좋다. 중괄호 블록을 생략하면 코드의 가독성이 좋지 않고, 버그 발생의 원인이 될 수 있다. 🏷 else-if 문 else-if는 상위 조건식이 false 일 경우 평가되고, else if 가 true이면 해당 블록이 실행된다. 마지막에는 else 블록을 추가할 수 있는데 모든 조건식이 false 이라면 else 블록을 실행하고 if문을 벗어나게 된다. 4.3 switch 문 변수의 값에 따라서 실행문이 결정되기 때문에 같은 기능의 if 문 보다 코드가 간결해..