diff --git a/src/main/java/com/yam/app/account/domain/Account.java b/src/main/java/com/yam/app/account/domain/Account.java
index 0fa5bbf..695d9f5 100644
--- a/src/main/java/com/yam/app/account/domain/Account.java
+++ b/src/main/java/com/yam/app/account/domain/Account.java
@@ -1,10 +1,10 @@
package com.yam.app.account.domain;
import lombok.Getter;
-import lombok.Setter;
+import lombok.ToString;
@Getter
-@Setter
+@ToString(exclude = "password")
public final class Account {
private Long id;
private String email;
@@ -16,4 +16,8 @@ public final class Account {
this.nickname = nickname;
this.password = password;
}
+
+ public void setId(Long id) {
+ this.id = id;
+ }
}
diff --git a/src/main/java/com/yam/app/account/domain/AccountReader.java b/src/main/java/com/yam/app/account/domain/AccountReader.java
new file mode 100644
index 0000000..be0423d
--- /dev/null
+++ b/src/main/java/com/yam/app/account/domain/AccountReader.java
@@ -0,0 +1,6 @@
+package com.yam.app.account.domain;
+
+public interface AccountReader {
+
+ Account findByEmail(String email);
+}
diff --git a/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java b/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java
new file mode 100644
index 0000000..c821714
--- /dev/null
+++ b/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java
@@ -0,0 +1,27 @@
+package com.yam.app.account.infrastructure;
+
+import com.yam.app.account.domain.AccountReader;
+import com.yam.app.account.domain.AccountRepository;
+import com.yam.app.account.domain.RegisterAccountProcessor;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AppConfiguration {
+
+ @Bean
+ public AccountRepository accountRepository(SqlSessionTemplate sqlSessionTemplate) {
+ return new MybatisAccountRepository(sqlSessionTemplate);
+ }
+
+ @Bean
+ public AccountReader accountReader(SqlSessionTemplate sqlSessionTemplate) {
+ return new MybatisAccountRepository(sqlSessionTemplate);
+ }
+
+ @Bean
+ public RegisterAccountProcessor registerAccountProcessor(AccountRepository accountRepository) {
+ return new RegisterAccountProcessor(accountRepository);
+ }
+}
diff --git a/src/main/java/com/yam/app/account/infrastructure/MybatisAccountRepository.java b/src/main/java/com/yam/app/account/infrastructure/MybatisAccountRepository.java
new file mode 100644
index 0000000..4b7d09f
--- /dev/null
+++ b/src/main/java/com/yam/app/account/infrastructure/MybatisAccountRepository.java
@@ -0,0 +1,45 @@
+package com.yam.app.account.infrastructure;
+
+import com.yam.app.account.domain.Account;
+import com.yam.app.account.domain.AccountReader;
+import com.yam.app.account.domain.AccountRepository;
+import org.mybatis.spring.SqlSessionTemplate;
+
+public final class MybatisAccountRepository implements AccountRepository, AccountReader {
+
+ private final SqlSessionTemplate template;
+
+ private static final String COMMAND_NAMESPACE = "com.yam.app.account.domain.AccountRepository.";
+ private static final String READER_NAMESPACE = "com.yam.app.account.domain.AccountReader.";
+
+ public MybatisAccountRepository(SqlSessionTemplate template) {
+ this.template = template;
+ }
+
+ @Override
+ public boolean existsByEmail(String email) {
+ int result = template.selectOne(COMMAND_NAMESPACE + "existsByEmail", email);
+ return result != 0;
+ }
+
+ @Override
+ public boolean existsByNickname(String nickname) {
+ int result = template.selectOne(COMMAND_NAMESPACE + "existsByNickname", nickname);
+ return result != 0;
+ }
+
+ @Override
+ public Account save(Account entity) {
+ int result = template.insert(COMMAND_NAMESPACE + "save", entity);
+ if (result != 1) {
+ throw new RuntimeException(
+ String.format("There was a problem saving the object : %s", entity));
+ }
+ return findByEmail(entity.getEmail());
+ }
+
+ @Override
+ public Account findByEmail(String email) {
+ return template.selectOne(READER_NAMESPACE + "findByEmail", email);
+ }
+}
diff --git a/src/main/java/com/yam/app/configuration/DatabaseConfiguration.java b/src/main/java/com/yam/app/configuration/DatabaseConfiguration.java
index 492a1c7..f1fc4ea 100644
--- a/src/main/java/com/yam/app/configuration/DatabaseConfiguration.java
+++ b/src/main/java/com/yam/app/configuration/DatabaseConfiguration.java
@@ -1,8 +1,12 @@
package com.yam.app.configuration;
import javax.sql.DataSource;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@@ -13,6 +17,21 @@ public class DatabaseConfiguration {
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
+ .addScript("classpath:sql/ddl.sql")
.build();
}
+
+ @Bean
+ public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
+ final var factoryBean = new SqlSessionFactoryBean();
+ factoryBean.setDataSource(dataSource);
+ var resolver = new PathMatchingResourcePatternResolver();
+ factoryBean.setMapperLocations(resolver.getResources("classpath:mapper/xml/*.xml"));
+ return factoryBean.getObject();
+ }
+
+ @Bean
+ public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
+ return new SqlSessionTemplate(sqlSessionFactory);
+ }
}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 85dee64..e69de29 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,2 +0,0 @@
-mybatis:
- mapper-locations: mapper/xml/*.xml
diff --git a/src/main/resources/mapper/xml/AccountCommandMapper.xml b/src/main/resources/mapper/xml/AccountCommandMapper.xml
new file mode 100644
index 0000000..1a548ce
--- /dev/null
+++ b/src/main/resources/mapper/xml/AccountCommandMapper.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+ INSERT INTO ACCOUNT(email, nickname, password)
+ VALUES(#{email}, #{nickname}, #{password})
+
+
+
diff --git a/src/main/resources/mapper/xml/AccountReaderMapper.xml b/src/main/resources/mapper/xml/AccountReaderMapper.xml
new file mode 100644
index 0000000..3e01d4c
--- /dev/null
+++ b/src/main/resources/mapper/xml/AccountReaderMapper.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/mapper/xml/empty.txt b/src/main/resources/mapper/xml/empty.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/main/resources/sql/ddl.sql b/src/main/resources/sql/ddl.sql
new file mode 100644
index 0000000..fdf9377
--- /dev/null
+++ b/src/main/resources/sql/ddl.sql
@@ -0,0 +1,12 @@
+create table account (
+ id bigint generated by default as identity,
+ email varchar(255) not null,
+ nickname varchar(255) not null,
+ password varchar(255) not null,
+ primary key (id)
+);
+
+alter table account add constraint UK_q0uja26qgu1atulenwup9rxyr unique (email);
+alter table account add constraint UK_s2a5omeaik0sruawqpvs18qfk unique (nickname);
+
+insert into account(email, nickname, password) values('jiwonDev@gmail.com', 'jiwon', 'password!');
diff --git a/src/test/java/com/yam/app/account/infrastructure/MybatisAccountRepositoryTest.java b/src/test/java/com/yam/app/account/infrastructure/MybatisAccountRepositoryTest.java
new file mode 100644
index 0000000..01dabaa
--- /dev/null
+++ b/src/test/java/com/yam/app/account/infrastructure/MybatisAccountRepositoryTest.java
@@ -0,0 +1,54 @@
+package com.yam.app.account.infrastructure;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.yam.app.account.domain.Account;
+import com.yam.app.account.domain.AccountReader;
+import com.yam.app.account.domain.AccountRepository;
+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;
+
+@SpringBootTest
+class MybatisAccountRepositoryTest {
+
+ @Autowired
+ private AccountRepository accountRepository;
+
+ @Autowired
+ private AccountReader accountReader;
+
+ @Test
+ @DisplayName("이메일 중복 쿼리 학습 테스트")
+ void existsByEmail() {
+ boolean result = accountRepository.existsByEmail("jiwonDev@gmail.com");
+
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ @DisplayName("닉네임 중복 쿼리 학습 테스트")
+ void existsByNickname() {
+ boolean result = accountRepository.existsByNickname("jiwon");
+
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ @DisplayName("사용자 이메일을 사용한 조회 테스트")
+ void findByEmail() {
+ Account account = accountReader.findByEmail("jiwonDev@gmail.com");
+
+ assertThat(account.getId()).isEqualTo(1);
+ }
+
+ @Test
+ @DisplayName("Account 객체 저장 테스트")
+ void save() {
+ Account account = accountRepository.save(
+ new Account("rebwon@gmail.com", "rebwon", "password!"));
+
+ assertThat(account.getId()).isEqualTo(2);
+ }
+}