반응형
✅ 데이터베이스
- 데이터를 저장하거나 조회하거나 수정하는 등의 기능을 구현해야 한다.
- 웹 서비스는 데이터를 처리할 때 대부분 데이터베이스를 사용한다.
- 데이터베이스를 사용하려면 SQL 쿼리(query)라는 구조화된 질의를 작성하고 실행하는 등의 복잡한 과정이 필요하다.
✅ ORM, Object Relational Mapping
- 자바 문법만으로도 데이터베이스를 다룰 수 있다.
- ORM을 이용하면 개발자가 쿼리를 직접 작성하지 않아도 데이터베이스의 데이터를 처리할 수 있다.
- ORM을 사용하면 내부에서 SQL 쿼리를 자동으로 생성해 주므로 직접 작성하지 않아도 된다.
- 즉, 자바만 알아도 데이터베이스에 질의할 수 있다.
- ORM을 이용하면 데이터베이스 종류에 상관 없이 일관된 코드를 유지할 수 있어서 프로그램을 유지·보수하기가 편리하다.
- 또한 내부에서 안전한 SQL 쿼리를 자동으로 생성해 주므로 개발자가 달라도 통일된 쿼리를 작성할 수 있고 오류 발생률도 줄일 수 있다.
💡 SQL 쿼리 비교
SQL 쿼리와 ORM을 비교해 보자.
다음과 같은 형태로 구성된 질문 테이블에 데이터를 입력한다고 가정해 보자.
ID | Subject | Content |
1 | 안녕하세요 | 가입 인사드립니다 ^^ |
2 | 질문 있습니다 | ORM이 궁금합니다 |
insert into question (subject, content) values ('안녕하세요', '가입 인사드립니다 ^^');
insert into question (subject, content) values ('질문 있습니다', 'ORM이 궁금합니다');
Question q1 = new Question();
q1.setSubject("안녕하세요");
q1.setContent("가입 인사드립니다 ^^");
this.questionRepository.save(q1);
Question q2 = new Question();
q2.setSubject("질문 있습니다");
q2.setContent("ORM이 궁금합니다");
this.questionRepository.save(q2);
✅ H2 데이터베이스
- JPA를 사용하기 전에 데이터를 저장할 데이터베이스를 설치해 보자.
- 개발시에는 Oracle, MSSQL 등의 굵직한 데이터베이스 보다는 설치도 쉽고 사용도 편리한 H2 데이터베이스를 많이 사용한다.
- H2 데이터베이스는 주로 개발용이나 소규모 프로젝트에서 사용되는 파일 기반의 경량 데이터베이스이다.
- 개발시에는 H2를 사용하여 빠르게 개발하고 실제 운영시스템은 좀 더 규모있는 DB를 사용하는 것이 일반적인 개발 패턴이다.
💡 H2 데이터베이스 설치
- build.gradle 파일 수정: 프로젝트의 build.gradle 파일을 열고, dependencies 항목에 다음 코드를 추가한다.
- runtimeOnly
- build.gradle 파일의 runtimeOnly는 해당 라이브러리가 런타임(Runtime)시에만 필요한 경우에 사용한다.
- 컴파일(Compile)시에만 필요한 경우에는 runtimeOnly 대신 compileOnly를 사용한다.
dependencies {
// 다른 의존성
runtimeOnly 'com.h2database:h2'
}
- Gradle 프로젝트 새로고침: build.gradle 파일을 수정한 후 Gradle 프로젝트를 반드시 새로고침 한다.
- 프로젝트 파일에서 마우스 오른쪽 버튼을 클릭하고, [Gradle -> Refresh Gradle Project]를 선택한다.
application.properties 파일을 작성한다.
- spring.h2.console.enabled: H2 콘솔의 접속을 허용할지의 여부이다. true로 설정한다.
- spring.h2.console.path: 콘솔 접속을 위한 URL 경로이다.
- spring.datasource.url: 데이터베이스 접속을 위한 경로이다.
- spring.datasource.url에 설정한 경로에 해당하는 데이터베이스 파일을 만들어야 한다.
- jdbc:h2:~/local 로 설정했기 때문에 사용자의 홈디렉터리(~ 에 해당하는 경로) 밑에 local.mv.db 라는 파일을 생성해야 한다.
- 본인이 사용하는 OS에 맞는 홈디렉터리에 local.mv.db 파일을 생성한다.
- type NUL > local.mv.db
- spring.datasource.driverClassName: 데이터베이스 접속시 사용하는 드라이버이다.
- spring.datasource.username: 데이터베이스의 사용자명이다. (사용자명은 기본 값인 sa로 설정한다.)
- spring.datasource.password :데이터베이스의 패스워드이다. 로컬 개발 용도로만 사용하기 때문에 패스워드를 설정하지 않았다.
# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
- URL 주소로 H2 콘솔에 접속한다.
- http://localhost:8080/h2-console
- H2 콘솔화면을 볼수 있다.
- 경로를 application.properties 파일에 설정한 jdbc:h2:~/local로 변경하고 "연결" 버튼을 클릭한다.
✅ JPA, Java Persistence API
- 스프링부트는 JPA(Java Persistence API)를 사용하여 데이터베이스를 처리한다.
- JPA는 자바 진영에서 ORM(Object-Relational Mapping)의 기술 표준으로 사용하는 인터페이스의 모음이다.
- JPA는 인터페이스이다.
- 따라서 인터페이스를 구현하는 실제 클래스가 필요하다. J
- PA를 구현한 대표적인 실제 클래스에는 하이버네이트(Hibernate)가 있다.
- SBB도 JPA + 하이버네이트 조합을 사용한다.
💡 JPA, Java Persistence API 환경설정
- H2 데이터베이스를 사용할 준비가 완료되었다.
- 이제 자바 프로그램에서 H2 데이터베이스를 사용할 수 있게 해야한다.
- 자바 프로그램에서 데이터베이스에 데이터를 저장하거나 조회하려면 JPA를 사용해야 한다.
- 하지만 JPA를 사용하기 전에 JPA를 사용하기 위한 준비 작업이 필요하다.
- build.gradle 파일 수정: 프로젝트의 build.gradle 파일을 열고, dependencies 항목에 다음 코드를 추가한다.
- implementation
- build.gradle 파일의 implementation은 해당 라이브러리 설치를 위해 일반적으로 사용하는 설정이다.
- implementation은 해당 라이브러리가 변경되더라도 이 라이브러리와 연관된 모든 모듈들을 컴파일하지 않고 직접 관련이 있는 모듈들만 컴파일하기 때문에 rebuild 속도가 빠르다.
dependencies {
// 다른 의존성
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
- Gradle 프로젝트 새로고침: build.gradle 파일을 수정한 후 Gradle 프로젝트를 반드시 새로고침 한다.
- 프로젝트 파일에서 마우스 오른쪽 버튼을 클릭하고, [Gradle -> Refresh Gradle Project]를 선택한다.
application.properties 파일에 다음 항목을 추가한다.
- spring.jpa.properties.hibernate.dialect: 데이터베이스 엔진 종류를 설정한다.
- spring.jpa.hibernate.ddl-auto: 엔티티를 기준으로 테이블을 생성하는 규칙을 정의한다.
- 위 설정에서 spring.jpa.hibernate.ddl-auto를 update로 설정했다. update와 같은 설정값에 대해서 간단히 알아보자.
- none - 엔티티가 변경되더라도 데이터베이스를 변경하지 않는다.
- update - 엔티티의 변경된 부분만 적용한다.
- validate - 변경사항이 있는지 검사만 한다.
- create - 스프링부트 서버가 시작될때 모두 drop하고 다시 생성한다.
- create-drop - create와 동일하다. 하지만 종료시에도 모두 drop 한다.
- 개발 환경에서는 보통 update 모드를 사용하고 운영환경에서는 none 또는 validate 모드를 사용한다.
# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
반응형
'기타 > 백엔드 기초' 카테고리의 다른 글
스트링부트 | 리포지터리 (0) | 2023.05.02 |
---|---|
스트링부트 | 엔티티 Entity (0) | 2023.05.02 |
스트링부트 | 스프링부트 프로젝트 구조 (0) | 2023.05.02 |
스트링부트 | Spring Boot Devtools, Live Reload, Lombok 사용법 및 설치 방법 (0) | 2023.05.02 |
스트링부트 | 컨트롤러 Controller (0) | 2023.05.02 |
스트링부트 | 스트링부트(String Boot)란? (0) | 2023.04.26 |
자바 Java | 접근제어자: 객체 지향 프로그래밍의 캡슐화 원칙과 예시 코드 (0) | 2023.03.07 |
자바 Java | import문 사용법과 단축키 (0) | 2023.03.07 |