카테고리 없음

스프링 스터디 5주차

wosrn 2024. 11. 17. 18:54

스프링 스터디 5주차 : 김영한의 스프링 입문강의 18,19,20강

 

18강 : h2 database 설치

여태까지 했던 방식은 따로 데이터베이스 없이 메모리에 저장하는 방식 이었기에, 껐다가 다시 켜면 데이터가 다 날아감 -> 이제 데이터베이스를 연결해보자

db 설치 후 애플리케이션 서버랑 db를 연결할건데, 이 연결에 필요한게 JDBC라는 기술

 

기술의 변화를 간단히 보면,

1) 순수 JDBC(매우 불편, 오래전 방식)

2) 스프링 JDBC 템플릿 으로 방식 변화 : 이번주 세션에 배운 방식이 JDBC 템플릿을 이용하여 DB 접근을 분리하는 방식이었다

3) JPA : SQL 쿼리 자체를 JPA라는 기술이 날려준 더욱 편리한 방식 - 객체를 쿼리 없이 바로 DB에 저장할 수 있다

4) 스프링 데이터 JPA : JPA를 더욱 편리하게 쓰도록 한번 감싼 기술

 

위의 기술들을 차례로 적용해볼 것이다

그전에 먼저 H2 데이터베이스를 먼저 설치해보자

 

처음에 압축을 풀었는데,

이렇게밖에 보이지가 않고 실행파일에 해당하는 것들이 없었다

저기 있는 콘솔을 눌러봐도 딱히 뭐가 나오질 않아서..

다시 한번 압축을 해제해보니 제대로 설치된걸 확인할 수 있었다

 

그리고 실행을 하려고 하는데,

이런 에러 메세지가 떴다

대강 읽어보니, 8082 포트가 이미 열려서(bind되어) 이 포트로 새로운 h2를 실행할 수 없다는 내용이었다

 

netstat 명령어를 확인해보니 8082 포트가 사용중인 프로그램의 PID가 4240임을 확인 가능했고, 4240 PID를 어떤 프로그램이 쓰는질 확인해보니 자바 프로그램이었다. 즉 JAVA 프로세스가 이미 H2 Web console이나 다른 자바 애플리케이션으로 실행되고 있다는 뜻이라고 한다 (즉 아까 내가 열심히 누른 h2 console이 내가 보는 창에서 새로 열리진 않았지만, 사실 이미 실행이 되어있었던것 같다)

그래서 이미 실행중인 http://localhost:8082 로 접속하니 h2 콘솔이 열려있었다

 

 

 

이제 성공하려나 하는 찰나.. not found 에러에 부딪혔다

구글링해보니 h2 최근 버전 부터는, 자동으로 database 파일을 생성하는걸 막아둬서 생기는 에러라고 한다

해결방법은, (여러 방식이 있는것같지만) 나는 홈 경로에 test.mv.db 파일을 수동으로 만들어주었다 (이때 처음엔 txt 파일로 만들기 시작하더라도 확장자를 모든 파일로 바꿔줘야한다!!) 

 

그 후 연결을 누르니 아래와 같이 연결이 잘 되었다

 

 

최초 연결 이후로는

jdbc:h2:tcp://localhost/~/test 이렇게 접근하라고 한다 (소켓으로 접속하는 방식)

그리고 나서 멤버 테이블을 생성

 

멤버 insert도 해본다

 

19강 : 순수 JDBC

**이 방식은 참고만 하자(고대엔 이렇게 했구나...)

먼저 application.properties에 위에서 생성한 h2 db를 연결해준다

그 후 reposiroty 폴더에 JdbcMemberRepository 파일을 만들어준다 (MemberRepository를 메모리로 구현하던 MemoryMemberRepository와 달리, db에 연결해서 구현하는 파일)

 

내용은 위와 같다

rs엔 생성된 key(id값)이 들어간다

try catch로 여러 예외도 처리한 뒤, 사용한 conn 등의 자원을 바로바로 release해줘야한다

close 시의 순서도 복잡한 편이다

 

조회에 관련된 코드 일부

 

 

 

SpringConfig.java를 다음과 같이 수정해준다

이 시점에서, MyAutoConfiguration, AppConfig, SpringConfig 클래스가 각각 어떤 역할을 하는지 차이가 궁금해졌다

 

1) MyAutoConfiguration: 자동 설정 클래스 - @ConditionalOnMissingBean 어노테이션은 같은 타입의 Bean이 이미 등록되어 있으면 이 설정을 무시, 사 용자가 명시적으로 설정한 Bean이 없을 때만 이 클래스의 HelloSpringApplication Bean이 등록됨

2) AppConfig: AOP 설정 및 전반적 애플리케이션 구성 - Spring AOP(Aspect-Oriented Programming)를 활성화 - Aspect와 Advice를 정의하고, 프록시 객체를 사용하여 메서드 호출 시점에 공통 로직(로깅, 트랜잭션 등)을 적용 = 환경 설정

3) SpringConfig: 핵심 비즈니스 로직 및 Repository 구성 - 애플리케이션의 주요 비즈니스 로직(memberService)과 데이터 접근 계층(JdbcMemberRepository)의 구성 요소를 명시적으로 정의, Spring Boot에서 자동으로 설정된 DataSource를 주입받아(@Autowired) 데이터베이스와 연결되는 Repository를 구성 = 핵심 기능

 

 

아무튼 이렇게 하고 다시 스프링부트를 실행하면 위처럼 이제 데이터가 날라가지 않고 뜬다 (h2 데이터베이스의 상태가 뜬다)

 

스프링의 장점 중 하나인 다형성이 여기서 나온다

서비스코드를 하나도 손대지 않고, 어플리케이션의 설정 에 해당하는 config 파일 코드만 바꿔줌으로써 데이터 저장소를 편하게 바꿔낄 수 있다

 

- 개방-폐쇄 원칙 : OCP - 확장에는 열려있고, 수정에는 닫혀있다 (JDBC 기반의 리포지토리는 새로 만들었지만, 기존 서비스코드나 다른 코드를 전혀 수정하지 않아도 됐음)

- DI를 사용하면, 기존코드 전혀 손대지 않고 설정만으로 구현클래스 변경 가능 (메모리 -> JDBC)

 

 

20강 : 스프링 통합 테스트

DB까지 통합하여 테스트를 해보자 

코드는 위와 같고, 기존 테스트코드와의 차이는 다음과 같다

- 리포지토리 객체를 MemoryMemberRepository가 아닌 그냥 멤버 리포지토리로 수정

- @Transactional : 테스트 후 자동으로 테스트객체 지워줌(롤백) - 다음 테스트 또 가능 (이 어노테이션이 테스트 코드에 붙었을 경우)

- @SpringBootTest : 스프링 컨테이너와 테스트 함께 실행