웹 서비스가 다룰 데이터의 양은 방대하다. 이러한 데이터를 웹서버에서 처리하는 것은 굉장히 부담스러운 일이기에 이러한 데이터에 관한 보관 및 처리는 데이터베이스 서버에 위임한다. 그렇기에 웹서버는 데이터베이스 서버와 끊임없이 소통해야 한다. 이러한 소통은 일반적으로 데이터베이스 언어인 SQL문을 이용하는데 웹서버를 구축하면서 따로 또 데이터베이스 언어를 배우는 것은 어려운 일이다. 그렇기에 SQL문을 자동으로 생성해주어 웹서버의 문법만으로도 데이터베이스와 소통할 수 있도록 하는 기술이 있는데 이를 ORM이라고 한다. ORM을 이용할 경우 프로그래머는 하나의 문법만으로 끊김없이 코드를 작성할 수 있다는 장점이 있다.
ORM
- 다음은 question이라는 테이블에 데이터를 새로 삽입하는 쿼리이다.
insert into question (subject, content) values ('안녕하세요', '가입 인사드립니다 ^^');
insert into question (subject, content) values ('질문 있습니다', 'ORM이 궁금합니다');
- 이에 대한 결과는 다음과 같을 것이다.
id | subject | content |
1 | 안녕하세요 | 가입 인사드립니다 ^^ |
2 | 질문 있습니다 | ORM이 궁금합니다 |
- 이를 자바 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);
- 여기서 Question이라는 클래스는 데이터 관리를 위한 ORM클래스로 엔티티라고 불린다. 이러한 엔티티 클래스로 만든 객체는 하나의 행과 같다.
- 엔티티 객체를 메서드를 사용하여 조회하고 업데이트하고 삭제하는 등 SQL문을 통한 데이터베이스 관리를 해야하는데 이러한 역할을 레포지토리가 해준다.
JPA
- 스프링부트는 JPA를 통해 데이터베이스를 처리한다. JPA는 자바 진영에서 ORM기술의 표준으로 삼고 있는 인터페이스들의 모음이다.
- JPA는 Java Persistence API로 기본적으로 인터페이스이다. 따라서 이를 구체화한 클래스가 필요한데 대표적으로 Hibernate가 있다.
H2 데이터베이스 이용해보기
- H2 데이터베이스는 주로 개발용으로 사용되는 파일기반 경량 데이터베이스이다. 보통 H2를 이용해 빠르게 개발을 하고, 실제 서비스를 할 때 무거운 데이터베이스를 이용한다.
1. 우선 build.gradle 파일의 dependencies에 runtimeOnly 'com.h2database:h2'를 추가한다. 이때 runtimeOnly는 해당 라이브러리를 런타임 시에만 사용한다는 의미이다. 이러한 행위는 라이브러리를 설치하는 행위와 비슷하다고 볼 수 있다.
2. application.properties에 다음과 같은 내용을 추가하여 이 프로젝트에서 H2데이터베이스를 사용할 수 있도록 설정한다.
# 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=
spring.h2.console.enabled : H2 콘솔의 접속 허용 여부
spring.h2.console.path : 콘솔 접속을 위한 URL 경로
spring.datasource.url : 데이터베이스 접속을 위한 경로
spring.datasource.driverClassName : 데이터베이스 접속시 사용하는 드라이버
spring.datasource.username : 데이터베이스 사용자명
spring.datasource.password : 데이터베이스 패스워드
3. 위의 url(데이터베이스 접속을 위한 경로)에 해당하는 데이터베이스 파일을 만든다. (H2는 파일기반 데이터베이스이다.) ~/local로 설정했을 경우 ~(유저 홈 디렉토리)에 local.mv.db파일을 생성해준다. 경로를 ~/test로 설정했을 시에는 test.mv.db파일을 생성하면 된다. 윈도우에서는 "C:\Users\(사용자명)"에 cmd명령어를 이용하여 파일을 생성할 수 있다. 또는 텍스트파일을 생성하여 이름과 확장자를 변경해주면 된다.
type nul > local.mv.db # 윈도우
touch local.mv.db # Mac
- 여기까지 완료했으면 로컬 서버를 실행하고,
- http://localhost:8080/h2-console
다음 URL을 입력하면 H2 콘솔화면을 볼 수 있다. 참고로 이 URL은 spring.h2.console.path의 내용에 따라 변화한다.
- 콘솔화면에서 JDBC URL 부분을 spring.datasource.url에 입력한 내용으로 변경하고 Connect를 누르면 연결이 완료된다.
자바로 H2 데이터베이스 사용하기
- 위에서 말했듯이 자바로 데이터베이스를 사용하기위해서는 JPA를 이용해야한다. 다만, JPA를 사용하기위해서는 사전작업이 필요하다.
1. build.gradle파일의 dependencies부분에 implementation 'org.springframework.boot:spring-boot-starter-data-jpa'를 추가해준다. 참고로 implementation은 라이브러리가 변경되더라도 관련된 모듈만 컴파일하기에 리빌드 속도가 빨라 일반적으로 라이브러리를 설치할 때 사용되는 설정이다.
2. application.properties에 다음과 같은 항목들을 추가해준다.
# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
- spring.jpa.properties.hibernate.dialect : 데이터베이스 엔진 종류 설정
- spring.jpa.hibernate.ddl-auto : 엔티티를 기준으로 테이블을 생성하는 규칙을 정의
규칙 | 내용 |
none | 엔티티가 변경되더라도 데이터베이스를 변경하지 않는다. |
update | 엔티티 변경부분만 데이터베이스를 업데이트한다.. |
validate | 변경사항이 있는지 검사만 하고 변경하지는 않는다. |
create | 서버를 시작할 때 모두 drop하고 다시 테이블을 생성한다. |
create-drop | create와 동일하지만 종료시에도 drop한다. |
- 보통 개발환경에서는 update를 배포 시에는 none 또는 validate를 사용한다.
출처 : 점프 투 스프링부트
'웹개발' 카테고리의 다른 글
리다이렉트, 포워드 (0) | 2023.08.08 |
---|---|
타임리프 템플릿에 데이터 전달하기 (0) | 2023.08.04 |
컨트롤러 (0) | 2023.06.18 |
스프링부트 프로젝트의 구조 (0) | 2023.06.18 |
데이터의 변환 (0) | 2023.05.27 |