경희대학교 컴퓨터공학부 하계 리턴 백엔드(스프링부트) 스터디 3주차 - 트랙장 최현영
- H2 및 Spring Data JPA 의존 라이브러리 추가
- H2 데이터베이스는 주로 개발용이나 소규모 프로젝트에서 사용되는 파일 기반의 경량 데이터베이스
- 애플리케이션이 실행될 때, 해당 포트로 접속할 수 있기때문에 종료된다면 데이터베이스도 같이 종료되며 기존에 저장된 데이터는 휘발된다.
dependencies {
...
runtimeOnly 'com.h2database:h2'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
...
}
설치한 H2 데이터베이스를 사용하기 위해서는 설정을 해야 한다. application.properties 파일을 application.yml
파일로 이름 변경(수정)하자.
⇒ 해당 파일을 리팩토링 들어가서 이름 변경하면 이름이 변경된다.

[파일명: /returnStudy/src/main/resources/application.yml]
# DATABASE
spring:
datasource:
driver-class-name: org.h2.Driver # 데이터베이스 접속시 사용하는 드라이버이다. Database를 H2로 사용하겠다는 것을 명시한다.
url: jdbc:h2:~/test # 데이터베이스 접속을 위한 경로이다.
username: sa # (사용자명은 기본 값인 sa로 설정한다.)
password: #로컬 개발 용도로만 사용하기 때문에 패스워드를 설정하지 않았다.
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
show_sql: true
format_sql: true
h2:
console:
enabled: true #H2 콘솔의 접속을 허용할지를 설정
path: /console #콘솔 접속을 위한 URL 경로이다.

- spring.jpa.hibernate.ddl-auto : 엔티티를 기준으로 테이블을 생성하는 규칙을 정의한다.
- none - 엔티티가 변경되더라도 데이터베이스를 변경하지 않는다.
- update - 엔티티의 변경된 부분만 적용한다.
- validate - 변경사항이 있는지 검사만 한다.
- create - 스프링부트 서버가 시작될때 모두 drop하고 다시 생성한다.
- create-drop - create와 동일하다. 하지만 종료시에도 모두 drop 한다.
- spring.jpa.properties.show_sql : sql문을 출력
- spring.jpa.properties.format_sql : sql을 이쁘게 정렬
개발 환경에서는 보통 update 모드를 사용하고 운영환경에서는 none 또는 validate 모드를 사용한다.
-
ORM(Object Relational Mapping)
- 자바의 객체와 RDB의 테이블을 자동으로 1:1 매핑해준다.
- 자바의 클래스와 같은 객체지향 관점과 데이터베이스와 같은 데이터 중심 관점에서의 패러다임 불일치가 발생하는데 이를 해결한다.
- 패러다임 불일치
- 세분성 : 테이블 수와 엔티티 클래스의 수가 서로 다를 수 있다.
- 상속성 : RDBMS에서는 상속이라는 개념이 없다
- 식별성 : 데이터베이스는 기본키와 같은 식별자로 동일성을 정의하지만, 자바의 경우 두 객체의 값이 같을지라도 참조값이 다르다면 다르다고 판별할 수 있다.
- 연관성 : 객체지향관점에서는 객체를 참조함으로써 연관성(의존성)을 나타내지만, RDBMS에서는 외래키만으로 연관성을 표현할 수 있다. 즉, 데이터베이스에서는 외래키만으로 양방향 연관관계를 표현할 수 있지만, 객체간에는 단방향만 가짐으로 불일치가 발생한다.
- 객체가 양방향을 가지기 위해서는 서로가 의존 객체를 필드로 지니고 있어야지 성립함
- ORM을 통해 쿼리문이 아닌 메서드로 데이터를 조작할 수 있다.
- ORM을 사용하면 내부에서 SQL 쿼리를 자동으로 생성해 주므로 직접 작성하지 않아도 된다. 즉, 자바만 알아도 데이터베이스에 질의할 수 있다.
- ORM을 이용하면 데이터베이스 종류에 상관 없이 일관된 코드를 유지할 수 있어서 프로그램을 유지·보수하기가 편리하다. 또한 내부에서 안전한 SQL 쿼리를 자동으로 생성해 주므로 개발자가 달라도 통일된 쿼리를 작성할 수 있고 오류 발생률도 줄일 수 있다.
-
JPA(Java Persistence API)
- JPA는 자바 진영에서 ORM(Object-Relational Mapping)의 기술 표준 명세서
- 실제로 동작하는 것[구현체]이 아닌 어떻게 동작해야하는지 메커니즘을 정리한 명세서이다.
- 내부적으로 JDBC[데이터베이스에 접속할 수 있도록 해주는 자바 API]를 사용한다.
- 기존에는 직접 SQL문을 작성하여 의존성이 높아 개발의 효율이 떨어짐
- JPA는 메서드를 통해 자동으로 SQL을 짜줌
- JPA의 대표적인 구현체인 하이버네이트를 주로 사용
-
Spring Data JPA
- Spring Data JPA는 하이버네이트를 조금 더 사용하기 쉽게 모듈화 해놓은 것
- CRUD 처리에 필요한 인터페이스를 제공(메서드 제공)하며, 하이버네이트의 엔티티 매니저를 직접 다루지 않고 리파지토리를 정의해 사용함으로써 스프링이 알아서 적합한 쿼리를 대신 생성해줌
- 엔티티 매니저 : 엔티티를 관리하는 객체
- 우리는 Spring Data JPA를 통해 데이터베이스의 상태를 변화시켜 줄 것이다.
-
롬복 익히기
-
롬복은 클래스를 생성할 때 반복적으로 사용하는 getter/setter, toString 같은 메서드를 어노테이션으로 대체하는 기능을 제공
-
롬복을 통해 코드를 짧게 구성할 수 있고 가독성을 높일 수 있다.
-
장점
- 어노테이션 기반으로 코드를 자동으로 생성하여 생산성이 높아진다
- 반복되는 코드를 생략할 수 있어 가독성이 높다
- 간단하게 코드를 유추할 수 있어 유지보수에 용이하다.
-
어노테이션 종류
- @Getter/ @Setter
- 자동으로 각 필드의 getter/setter 메서드를 생성해줌
- 생성자 자동 생성 어노테이션
- @NoArgsConstructor : 매개변수가 없는 생성자를 자동으로 생성(기본 생성자와 같음)
- @AllArgsConstructor : 모든 필드를 매개변수로 하는 생성자를 자동으로 생성
- @RequiredArgsContructor : 필드 중 final 접근 한정자(상수)로 설정된 필드를 갖는 생성자를 자동으로 생성함
- @Tostring
- Object 클래스의 메서드인 toString() 메서드를 자동으로 오버라이딩 해줌
- 해쉬값이 아닌, 각각의 필드값을 문자열로 반환해줌
- @EqualsAndHashCode
- 객체의 동등성과 동일성을 비교하는 연산 메서드를 자동으로 생성
- Object 클래스의 메서드인 hashCode와 equals 메서드를 자동으로 오버라이딩 해줌
- 동등성 : 비교 대상이 되는 두 객체가 가진 내용이 같음
- 동일성 : 비교 대상이 되는 두 객체가 같은 해쉬값[주소값]을 가진 객체
@Data
- 앞서 설명한 모든 어노테이션을 모두 포괄함
- 이거 하나로 모든것이 해결됨