Create a query to check for nickname and email redundancy.

implements mybatis query logic.
This commit is contained in:
Rebwon
2021-08-26 17:55:49 +09:00
committed by MaengSol
parent e3abe28387
commit deb89d16f7
11 changed files with 203 additions and 4 deletions

View File

@@ -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;
}
}

View File

@@ -0,0 +1,6 @@
package com.yam.app.account.domain;
public interface AccountReader {
Account findByEmail(String email);
}

View File

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

View File

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

View File

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

View File

@@ -1,2 +0,0 @@
mybatis:
mapper-locations: mapper/xml/*.xml

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yam.app.account.domain.AccountRepository">
<select id="existsByEmail" parameterType="String" resultType="int">
SELECT COUNT(email)
FROM ACCOUNT
WHERE email = #{email}
</select>
<select id="existsByNickname" parameterType="String" resultType="int">
SELECT COUNT(nickname)
FROM ACCOUNT
WHERE nickname = #{nickname}
</select>
<insert id="save" parameterType="com.yam.app.account.domain.Account">
INSERT INTO ACCOUNT(email, nickname, password)
VALUES(#{email}, #{nickname}, #{password})
</insert>
</mapper>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yam.app.account.domain.AccountReader">
<select id="findByEmail" parameterType="String"
resultType="com.yam.app.account.domain.Account">
SELECT * FROM ACCOUNT WHERE email = #{email}
</select>
</mapper>

View File

@@ -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!');

View File

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