[신세계I&C KDT][Spring Boot] #37 DB 연동 (0604, 0605)

박현아·2024년 6월 4일
0

신세계아이앤씨 KDT

목록 보기
41/42

Spring 기반의 DB 연동

1. JDBC vs SpringJDBC

  • sql 이용
  • JDBC 보다 자바코드가 훨씬 적음

2. SpringJDBC + h2 연동

1) 의존성 설정

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
	<artifactId>h2</artifactId>
	<scope>runtime</scope>
</dependency>

2) h2 관리자 콘솔 설정

  • 웹페이지로 제공
    (1) 의존성 설정
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

(2) h2 관리자 콘솔 활성화
*application.properties
spring.h2.console.enabled=true

(3) Application.java 실행

  • 다음과 같이 console에 h2 관리자 정보가 출력됨
    H2 console available at '/h2-console'.
    Database available at 'jdbc:h2:mem:651ffe6a-34d5-45e4-b332-650160bfac88'

(4) 웹브라우저에 요청
http://localhost:8080/h2-console

  • 요청 URL은 실행시마다 매번 랜덤하게 바뀜
    URL 고정
    *application.properties
    spring.datasource.url=jdbc:h2:mem:testdb

3) 자동으로 테이블 생성 + 데이터 저장하는 작업 처리

  • 매 실행마다 자동으로 파일 인식해서 처리함
  • src/main/resources
    schema.sql : create table문
    data.sql : insert문

  • schema.sql
    create table todo(
    id int primary key,
    name varchar(255) not null,
    author varchar(255) not null);

  • data.sql
    insert into todo (id,name,author) values(1, 'boot공부','홍길동');
    insert into todo (id,name,author) values(2, 'react공부','홍길동');
    insert into todo (id,name,author) values(3, 'CI/CD공부','홍길동');

4) boot와 연동

  • 전체적인 아키텍쳐
					  TodoH2Service
Application.java <--> TodoH2ServiceImpl <--> TodoH2Repository (DAO) <---> h2
										   TodoDTO (Todo)
  • sql문 + JdbcTemplate 빈 이용해서 연동
    DML(insert/delete/update) : update()
    단일레코드 조회 : queryForObject(sql, RowMapper인터페이스, 파라미터값)
    다중레코드 조회 : query(sql, RowMapper인터페이스 [, 파라미터값])

3. SpringJDBC + mysql 연동

1) 의존성 설정

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

2) DB 연동 위한 4가지 정보 설정

-- application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=1234

3) schema.sql과 data.sql 활성화

https://docs.spring.io/spring-boot/docs/2.7.18/reference/htmlsingle/

-- application.properties
spring.sql.init.mode = always | never

4. mybatis + mysql 연동 1 ⭐⭐

: @Repository 클래스 + TodoMapper.xml 연동
파이널 프로젝트에서 쓸 것 !!

1) 의존성 설정

<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

2) DB 연동을 위한 4가지 정보 설정

-- application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=1234

3) TodoDTO.java

4) TodoMyBatisMySQLRepository.java

(1) 이전 버전

Service 클래스						 DAO 클래스
SqlSession 얻기 <-----------------> SqlSession 사용
				  SqlSession 전달
 트랜잭션 처리
 close()

==> 이전 SE 버전에서는 DAO에서 사용하는 sqlSession을 Service에서 얻어서 DAO에 넘겨주는 형태로 사용했음. 그 이유는 트랜잭션 처리 때문이다
==> 트랜잭션 처리는 session.commit() / session.rollback()으로 처리함

(2) Spring

==> Spring에서는 SqlSession 역할을 하는 빈이 제공됨 (SqlSessionTemplate)

Service 클래스 					DAO 클래스 (Repository)

								  SqlSessionTemplate 얻기
                                  
@Transactional
public void tx() {

	insert();
    delete();
}

==> @Transactional 동작 방식

  • insert()와 delete() 모두 성공하면 자동으로 commit
  • 두 작업 중 하나라도 RuntimeException이 발생되면 자동으로 모두 rollback 해줌

5) TodoMyBatisMySQLService.java, TodoMyBatisMySQLServiceImpl.java

6) TodoMapper.xml

  • src/main/resources
    com.exam.cofig
    TodoMapper.xml

7) 별칭과 mapper 등록

-- application.properties에

# 별칭
mybatis.type-aliases-package=com.exam.dto

# mapper 등록 (하나로 퉁치기)
mybatis.mapper-locations=com/exam/config/*Mapper.xml
#mybatis.mapper-locations=com/exam/config/TodoMapper.xml

5. mybatis + mysql 연동 2 ⭐⭐

  • @Mapper 인터페이스 (TodoMapper.java) + TodoMapper.xml 연동
    파이널 프로젝트에서 쓸 것 !!

1) 기존 repository 삭제
2) com.exam.config.TodoMapper.java 인터페이스 작성
3) TodoMapper.xml의 namespace 값
( < mapper namespace="com.exam.config.TodoMapper" > ) 과
TodoMapper 인터페이스의 경로가 반드시 일치해야 된다
4) TodoMapper.java에 @Mapper 어노테이션 지정
5) TodoMapper.java 인터페이스의 메서드명과 TodoMapper.xml의 id 값이 일치해야된다

6. Spring framework 및 Spring boot 트랜잭션 처리

  • Service 빈에서 @Transactional 어노테이션으로 트랜잭션을 처리한다
  • @Transactional
    - 클래스 레벨 : 클래스 내의 모든 메서드가 트랜잭션으로 처리됨
    - 메서드 레벨 : 지정된 메서드에서만 트랜잭션으로 처리됨

0개의 댓글