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); + } +}