Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.javabom.toby.chapter7.내장형_db;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.transaction.support.TransactionTemplate;

@Configuration
public class DbConfig {

/**
* 내장형 db Builder 를 사용한 EmbeddedDatabase
* DataSource 를 상속
*/
@Bean
public EmbeddedDatabase embeddedDatabase() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("setup-sql.sql")
.build();
}

@Bean
public JdbcTemplate template() {
return new JdbcTemplate(embeddedDatabase());
}

/**
* 트랜잭션을 보장을 위한 Template
*/
@Bean
public TransactionTemplate transactionTemplate() {
return new TransactionTemplate(new DataSourceTransactionManager(embeddedDatabase()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.javabom.toby.chapter7.내장형_db;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;

@Getter
@ToString
@EqualsAndHashCode
public class User {
private String id;
private String name;

public User(String id, String name) {
this.id = id;
this.name = name;
}
}
6 changes: 6 additions & 0 deletions spring-toby/spring-project/src/main/resources/setup-sql.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
CREATE TABLE TEST_USER(
id varchar(100) primary key ,
name varchar(100)
);

INSERT INTO TEST_USER VALUES ('jaeyeon.seo', '서재연');
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.javabom.toby.chapter7.내장형db;

import static org.assertj.core.api.AssertionsForInterfaceTypes.*;
import static org.junit.jupiter.api.Assertions.*;

import java.util.List;
import java.util.Map;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import com.javabom.toby.chapter7.내장형_db.DbConfig;
import com.javabom.toby.chapter7.내장형_db.User;

@SpringBootTest(classes = DbConfig.class)
class H2DbTest {
@Autowired
JdbcTemplate jdbcTemplate;

@Autowired
TransactionTemplate transactionTemplate;

@Test
void test() {
List<User> results = jdbcTemplate.query("SELECT * FROM TEST_USER", (rs, rowNum) -> new User(rs.getString("id"), rs.getString("name")));

assertAll(
() -> assertThat(results.size()).isEqualTo(1),
() -> assertThat(results).contains(new User("jaeyeon.seo", "서재연"))
);
}

@DisplayName("트랜잭션")
@Test
void transaction() {
try {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
updateSql("aaa", "bbb");
updateSql("ccc", "ccc"); // exception
}
});
} catch (RuntimeException ex) {
// ignore
}

// aaa 조회
List<Map<String, Object>> user = jdbcTemplate.queryForList("SELECT* FROM TEST_USER WHERE ID = 'aaa'");

assertThat(user).isEmpty();
}

private void updateSql(String id, String name) {
if (id.equals("ccc")) {
throw new RuntimeException();
}
jdbcTemplate.execute(String.format("INSERT INTO TEST_USER VALUES('%s', '%s')", id, name));
}

}