TIL - JAVA spring DAY 13

jihan kong·2022년 1월 21일
0

JAVA spring 입문

목록 보기
15/20
post-thumbnail

H2 database

지난 시간까지 웹 MVC의 설계를 모두 완료했다. 그러나, 우리가 지금까지 만든 서비스는 메모리에 저장되기 때문에 서버를 내리게 되면 저장했던 데이터들이 모두 날아가게 된다. 이에 실무에서는 DB에 직접 데이터를 저장하고 관리하게 된다. 따라서 오늘부터는 spring DB를 접근하는 기술을 학습하게 되었다.

DB가 설치되어있으므로 DB SQL과 서버를 연결시킬 수 있는데, 이 때 연결을 할 때 사용하는 기술이 Jdbc이다. 강사님께서 말씀하시길, 한 20년 전에는 순수하게 Jdbc로 개발을 했다고 하는데 과정이 매우 복잡하고 어렵다고 한다. 따라서 모두의 정신 건강을 위해 가볍게 참고만 하면 좋겠다고 하셨다.

보통 DB는 실무에서는 mySQL이나 Oracle 을 많이 쓰는데 특히, mySQL 계열의 데이터베이스를 많이 사용한다. 그러나 우리는 그렇게 거창한 데이터베이스보다는 용량이 작아 가볍고 빠르며 Jdbc API가 탑재되어 교육, 테스트용으로 적합한 H2 Database 를 활용하기로 했다.

h2 database는 여기서 다운받을 수 있다.
https://www.h2database.com/html/download-archive.html
(h2 데이터베이스는 1.4.200 버전을 다운받는 것을 추천한다. 최근에 release된 버전은 일부 기능이 정상 동작하지 않는다.)

정상적으로 다운을 받았으면 실행을 시켜주면 되는데, 나의 경우 window OS를 사용하고 있기 때문에, h2.bat 배치파일만 실행시켜주기만 하면 되었다. (Mac os의 경우, console을 통해 chmod 755 h2.sh 로 프로그램에 실행 권한을 부여하고, ./h2.sh 로 실행한다.)

h2 database를 실행을 시키면 H2 콘솔이라고 해서 웹 상에서 다음과 같은 콘솔화면이 뜬다.

이제 연결 버튼을 누르게 되면,

위와 같이 Query를 탐색할 수도 있고, 직접 SQL 문도 작성할 수 있는 데이터베이스가 화면상에 나타나게 된다.

그런데 연결 전의 창을 다시 한번 살펴보자. JDBC URL 부분을 보면, jdbc:h2:~/test 라고 되어있는 것을 볼 수 있다. 사용자 home에 test.mv.db 파일을 생성해서 접근한다는 것을 의미한다.
그러나 이렇게 파일로 접근하게 되면 애플리케이션과 웹 콘솔 간에 충돌이 발생할 수 있다고 하셨다. 파일로 직접 접근하는 것이 아니라 network socket 을 통해 여러 커넥션으로 연결해도 무방하도록 하기 위해서 jdbc:h2:tcp://localhost/~/test 와 같이 localhost를 통해 연결할 수 있도록 바꾸었다.

이 후, 테이블을 관리하도록 하기 위해 프로젝트 루트에 sql/ddl.sql 파일을 다음과 같이 SQL 문을 작성하여 생성한다.

drop table if exists member CASCADE;
create table member
(
	id bigint generated by default as identity,
	name varchar(255),
	primary key (id)
);

Member table이 생성된 것을 확인할 수 있다.

간단하게 SQL 문을 통해 Member table에 값을 추가해보자.

SQL 문 입력 칸에
insert into member(name) values('spring')
insert into member(name) values('spring2')
를 추가하고 select 문으로 table 내용을 확인해보면,

이처럼 테이블에 필드가 추가되어있는 것을 볼 수 있다. 그렇다면 이제 Jdbc를 통해 DB와 server를 연결해보자.

순수 Jdbc

Jdbc를 사용하기 위해서는 Jdbc 환경 설정을 먼저 해야한다.
먼저, build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리를 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'

그 후, 스프링 부트 데이터베이스( resources/application.properties )
에 연결 설정을 추가해준다. h2 DB에 접근할 것이기 때문에 h2 Driver를 세팅해주는 것이다.

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa

이렇게 하면 데이터베이스에 접근하기 위한 준비 과정은 모두 끝났다.

다음으로 Jdbc 회원 리포지토리를 개발하는 과정이다. 기존처럼 MemoryMemberRepository를 사용하면 되지 Jdbc Member Repository는 왜 만들려고 하는 것일까? 물론 회원을 저장하는 역할은 MemoryMemberRepository 가 하지만 구현을 메모리에 할 것인지, 아니면 Jdbc를 통해 DB에 연동을 시킬 것인지의 차이가 있는 것이다.

그리고, 강사님께서 Jdbc API로 직접 코딩해서 Jdbc 리포지토리를 구현하는 과정을 보았다. 꽤 방대한 볼륨 (너무 길어서 포스팅 상에서는 생략) 이었는데 sql문도 많이 포함되었고 try catch문으로 예외처리하는 코드만 수십줄이었다. (20년 전 개발자들은 정말 고생하셨을 것 같다는 생각을 했다...Thanks to 선배님들..)

어찌됐든, 리포지토리 구현이 끝나면 스프링 설정을 변경해주어야하는데 우리가 예전에 코드로 Spring bean을 직접 등록할 때 만들었던 Spring config 를 열어볼 때가 되었다.

package hello.hellospring;
import hello.hellospring.repository.JdbcMemberRepository;
import hello.hellospring.repository.JdbcTemplateMemberRepository;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;

@Configuration
public class SpringConfig {
	
    	private final DataSource dataSource;
	
    	public SpringConfig(DataSource dataSource) {
		this.dataSource = dataSource;
	}
    
	@Bean
	public MemberService memberService() {
		return new MemberService(memberRepository());
	}
	@Bean
	public MemberRepository memberRepository() {
		// return new MemoryMemberRepository();
		return new JdbcMemberRepository(dataSource);
	}
}

먼저 private final DataSource dataSource; 을 살펴보면, DataSource 는 데이터베이스 커넥션을 얻고자 할때 사용하는 객체이다. 스프링 부트는 커넥션 정보를 바탕으로 스프링 빈을 만들 수 있는 것이다.

한 편,MemberRepository 메소드를 보자. 원래는 return new MemoryMemberRepository( ); 로 설정했었다. (주석처리한 부분) 그러나 우리가 사용할 리포지토리 JdbcMemberRepository 로 교체된 것을 볼 수 있다.

(사진 출처: 인프런, 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술, 강사: 김영한)

DAY 9에서 이에 대해 포스팅한 적이 있다. 스프링의 DI (Dependencies Injection) 를 사용하면 기존 코드들을 수정할 필요 없이 Config 설정의 수정만으로 클래스를 변경할 수 있는 것이다. 이렇게 데이터를 DB에 저장하게 되므로 스프링 서버를 다시 부팅해도 데이터가 저장될 수 있다.

실제로 localhost:8080으로 접속해서 바로 회원 목록에 들어가 보니 이전에 등록한 회원정보가 저장되어 있다.

다형성 - Polymorphism

강사님께서 이와 같은 원칙을 개방-폐쇄 원칙(OCP, Open-Closed Principle) 이라고 하셨다. 즉, 확장에는 열려있고, 수정이나 변경에는 닫혀있다는 뜻이다. java의 가장 큰 장점. 즉, 객체지향 프로그래밍의 가장 큰 메리트가 바로 다형성이라고 생각한다. spring은 이를 잘 활용할 수 있게 만들어준다. 다음 시간에는 스프링을 통합해서 테스트하는 시간을 가질 계획이다.

profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글