- Published on
스프링 프레임워크 첫걸음 - 4장 : 데이터베이스 작업
- Authors
- Name
- 손예지(Liv)
일반적으로 데이터베이스를 사용할때는 터미널을 통해 데이터베이스에 직접 접속하거나, DB 툴(dbeaver, mysqlWorkbench)을 사용하는 방법을 사용합니다. 스프링에서 데이터베이스를 사용할때는 매퍼를 사용해 데이터베이스의 데이터들을 조작합니다. 4장에서는 데이터베이스(postgreSQL)에 직접 접속해 데이터베이스를 사용해보고, 스프링 JDBC를 통해서 데이터베이스를 사용하는 방법에 대해 알아보겠습니다.
1. 데이터베이스 접속과 환경설정
PostgreSQL을 사용해서 데이터베이스를 접속해보겠습니다. 먼저 PostgreSQL이 설치되어 있어야 하는데, MacOS를 사용하고 있는 경우 homebrew를 통해 간단히 설치할 수 있습니다. postgreSQL 홈페이지 에서 최신버전을 확인 할 수 있습니다. 저는 15버전을 다운로드 하였습니다.
brew install postgresql@15
설치 후, 아래와 같이 환경 설정을 해줍니다.
echo 'export PATH="/opt/homebrew/opt/postgresql@15/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
export LDFLAGS="-L/opt/homebrew/opt/postgresql@15/lib"
export CPPFLAGS="-I/opt/homebrew/opt/postgresql@15/include"
환경설정까지 완료되었다면, postgreSQL에 접속하는 명령어를 터미널에 입력해줍니다. 서버를 시작할때 각자가 설치한 postgreSQL 버전에 맞춰서 시작 명령어를 입력해야 합니다. 15버전을 설치한 경우, @15를 뒤에 붙여줍니다. 데이터베이스에 접속했다면, psql postgres 명령어를 입력합니다. 여기까지 에러메세지 없이 입력 되었다면 접속에 성공한 거라고 볼 수 있습니다. 데이터베이스에 접속한 후, \du 명령어를 입력하면 할당된 사용자를 확인할 수 있습니다. 이때 확인한 사용자는 DB툴을 연동할때 사용할 수 있습니다.
brew services start postgresql@15
psql postgres
postgres=# \du
postgreSQL 서버를 실행했다면 종료도 해줘야 하는데, 서버 시작과는 다르게 버전을 명시해주지 않아도 됩니다.
brew services stop postgresql
터미널을 통해서 데이터베이스에 접속해 사용할 수도 있지만, postgreSQL은 pgAdmin4라는 데이터베이스 뷰어를 제공합니다. 데이터베이스 툴을 사용하면 더 쉽게 테이블과 각 컬럼의 구조를 확인하고 수정할 수 있습니다.
pgdmin4를 사용하기 위해서는 pgAdmin 다운로드 사이트에서 각 OS에 맞는 버전을 다운로드 합니다. 다운로드 한 후 Server - Register - Server 경로를 통해 등록 할 수 있습니다. Genral 탭에서 서버 이름, Connection 탭에서 Hostname은 localhost, 이전 \du 명령어를 통해 확인했던 Username, 사용하고자 하는 Password를 입력해줍니다. 테이블을 저장하면, postgreSQL에서 자동으로 생성한 테이블인 postgre 이름의 데이터베이스를 확인할 수 있습니다.

2. 데이터베이스 생성과 입력
pgAdmin4에 postgreSQL이 올바르게 연결되었다면 pgAdmin4를 통해 테이블을 생성하고, 조회하고, 수정하고, 삭제하는 기능을 수행해 보겠습니다.
먼저 회원 정보를 저장하는 member 테이블을 생성해보겠습니다. 데이터베이스 이름 - Schemas - Tables 경로로 접근해 Create - Table 을 실행합니다.

member 테이블에 id와 name 두개의 컬럼을 생성해주겠습니다. 데이터 타입과 제약조건을 설정할 수 있습니다.

생성한 테이블에서 오른쪽 마우스를 클릭하면 Query Tool 화면이 노출되는데 Query Tool에서 쿼리문을 수행할 수 있습니다.
3. 스프링 데이터 JDBC 사용해보기
애플리케이션에서 사용하는 객체와 관계형 데이터베이스의 데이터를 매핑하는 것을 O/R(Object-relational Mapper)라고 부릅니다. 사용자가 직접 데이터베이스에 접속하거나, SQL문을 직접 주입하지 않고 매퍼를 통해 데이터를 매핑하는 것을 의미합니다.
스프링에서 member 테이블에 JDBC를 사용해서 데이터 삽입과 조회를 수행하는 프로그램을 만들어보겠습니다. Spring 프로젝트를 생성합니다. 데이터베이스를 사용하기 위해서는 데이터베이스 접속 정보가 필요합니다. 이때 입력해야 하는 정보는 사용하고자 하는 데이터베이스의 드라이버의 클래스명, 데이터베이스의 접속 URL, 그리고 사용자 이름과 비밀번호 입니다.
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=아이디
spring.datasource.password=비밀번호
데이터베이스 설정을 마쳤다면, 스프링에서 데이터베이스 엔티티와 레포지토리를 생성해보겠습니다.
엔티티와 레포지토리
엔티티는 데이터베이스 테이블의 한 행에 대응하는 객체입니다. 엔티티의 필드는 테이블의 컬럼 값에 대응합니다. 레포지토리는 데이터베이스를 조작하는 클래스입니다.(p.99, 100)
이전 데이터베이스에서 생성한 member 테이블과 대응하는 Member 엔티티를 만들어보겠습니다.(Spring 프로젝트를 생성했다는 가정 하에 진행해보겠습니다.) entity 패키지 안에 Member 이름의 클래스를 생성합니다. 클래스 안에 id와 name 을 선언했습니다.
package springdatajdbcsample.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
@Id
private Integer id; // 번호
private String name; // 이름
}
Lombok에서 지원하는 @Data, @NoArgsConstructor, @AllArgsConstructor 어노테이션을 사용해 getter/setter와 생성자를 생성해줬습니다. id 필드에 @Id 어노테이션을 부여함으로 테이블의 기본키 설정을 할 수 있습니다.
엔티티를 생성했다면, 레포지토리를 만들어야 합니다. entity 패키지를 만들었던것 처럼 repository 패키지 안에 MemberCrudRepository 이름의 레포지토리를 생성해보겠습니다.
package springdatajdbcsample.repository;
import org.springframework.data.repository.CrudRepository;
import springdatajdbcsample.entity.Member;
public interface MemberCrudRepository extends CrudRepository<Member, Integer> {
}
MemberCrudRepository 레포지토리는 CrudRepository 를 상속합니다. 파라미터로는 도메인의 타입(Member)과 기본키로 설정한 컬럼의 타입(Integer)을 입력해줍니다.
마지막으로 스프링부트를 실행해보겠습니다. 책에서는 동작방식 설명을 위해 스프링부트 메인 클래스에서 직접 메서드를 만들어서 호출하도록 했는데, 실제로 프로젝트를 진행할때 메인메서드에서 직접 호출하는 경우는 거의 없었기 때문에 참고만 해볼 수 있겠습니다.
private void executeSelect(){
System.out.println("====전체 데이터를 취득합니다====");
Iterable<Member> members = repository.findAll();
for (Member member : members){
System.out.println(member);
}
}
executeSelect 메서드를 예시로 살펴보면, findAll 메서드를 호출하게 되면 아래 반복문 안에 모든 엔티티를 반환해줍니다. 여기서 members는 Member 엔티티, 즉 member 테이블의 값을 가져오게 됩니다. 스프링부트의 메인메서드를 호출하게 되면, 아래와 같이 테이블에 저장되어 있는 값을 가져옵니다.

postgreSQL에서 SELECT 문을 실행한 결과와 동일한 것을 확인할 수 있습니다.

정리
4장에서는 postgreSQL을 사용해 테이블을 생성하고 조작하는 방법에 대해서 살펴봤습니다. 그리고 스프링에서 JDBC 매퍼를 통해 CRUD 기능이 어떻게 동작하는지 알아봤습니다. 매퍼를 사용하면 쿼리를 직접 주입하는 방식보다 보안적인 측면에서 더 안전하고, 쿼리의 변경이 있을때 보다 쉽게 변경할 수 있기 때문에 선호되는 방식인것 같습니다.
참고자료:
스프링프레임워크 첫걸음, 후루네스 키노시타 마사아키
https://www.postgresqltutorial.com/
https://pingpongdev.tistory.com/25
https://docs.spring.io/spring-data/jpa/reference/jpa/getting-started.html