2022. 3. 25. 03:20ใ๊ฐ๋ ์ ๋ฆฌ ์์ ์ค/๋ฌธ์ ์ ๋ฆฌ
๐ทโ๏ธ ์์ ์ค์ธ ๋ด์ฉ
์ฃผ๋ํ๋์ Spring๊ณผ Vue.js๋ฅผ ์ด์ฉํด์ ํ์ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ง๋ค๊ณ ์๊ณ , ํ์ฌ ์ค๋ณต ํ์ธ์ ๋ํ ๊ธฐ๋ฅ์ ๋ง๋ค๊ณ ์๋ ๊ฒ์ด์์.
๐ฝ Spring Boot(Maven - mybatis)
๐ฆ UserController.java
๐ฆ UserService.java
๐ฆ UserService.java
/**
* ํ์ ๊ฐ์
๊ด๋ จ ๋น์ฆ๋์ค ๋ก์ง
* <pre>
* <b>History:</b>
* ์ฃผ๋ํ๋, 1.0.0, 2022.03.24 ์ต์ด ์์ฑ
* </pre>
*
* @author ์ฃผ๋ํ๋
* @version 1.0.0, 2022.03.24 ์ต์ด ์์ฑ
* @See ""
* @see <a href=""></a>
*/
@RequiredArgsConstructor @Slf4j
@Service public class UserServiceImpl implements UserService {
private final PasswordEncoder passwordEncoder;
private final UserMapper userMapper;
/**
* ํ์ ๊ฐ์
์ ๋ฑ๋ก๋ ์ ๋ณด ์ธ์ง ํ์ธ
* @param duplicateByIdInfoDTO - ํ์ ๊ฐ์
์ ๋ฑ๋ก๋์ด ์๋ ์ ๋ณด ์ธ์ง ํ์ธ์ ์ํ ์ด์ฉ์ ์
๋ ฅ ํ์ ์ ๋ณด
* @return CustomUserDetails - ํด๋น ํ์์ ์ ๋ณด ๋ฐํ
* @see ""
*/
@Override
public DefaultResponse duplicateUserInfo(DuplicateByIdInfoDTO duplicateByIdInfoDTO) {
log.info("UserServiceImpl์ duplicateId(String username)๊ฐ ํธ์ถ ๋์์ต๋๋ค! Client๋ก ๋ถํฐ ์ ๋ฌ๋ ๊ฐ : " + duplicateByIdInfoDTO.toString());
if (duplicateByIdInfoDTO == null) {
log.info("์ด์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ์ด ๋ชจ๋ null ์
๋๋ค.");
return DefaultResponse.response(400, "์๋ชป๋ ์์ฒญ", "Bed Request");
} // if (duplicateByIdInfoDTO == null) ๋
log.info("DB์์ ํ์ ๊ฐ์
์์ฒญ ์ด์ฉ์๊ฐ ์
๋ ฅํ UserId(username)๋ฅผ ํตํด ํด๋น ํ์์ด ๋ฑ๋ก ๋์ด ์๋์ง ์ฐพ๊ฒ ์ต๋๋ค!");
Optional<DuplicateByIdInfoDTO> findByUserInfo = userMapper.findByUserInfo(duplicateByIdInfoDTO);
if (findByUserInfo.isEmpty()) {
log.info("ํ์ ๊ฐ์
์์ฒญ ์ด์ฉ์๊ฐ ์
๋ ฅํ Email ์ฃผ์๊ฐ DB์ ์ ์ฅ ๋์ด ์์ง ์์ต๋๋ค!");
log.info("ํ์ ๊ฐ์
์
๋ ฅ๋ ์ค ์ค๋ณต ๋ถ๊ฐํ ๊ฐ์ ๋ํด ์ค๋ณต ๊ฐ์ด ์๋์ง ํ์ธ ํ๊ฒ ์ต๋๋ค!");
return findByUserInfo.filter(user -> user. getUserEmail().equals(duplicateByIdInfoDTO.getUserEmail()))
.map(user -> {
log.info("์ด๋ฏธ ์กด์ฌํ๋ E-mail ์ฃผ์ ์
๋๋ค! 409 Code์ ํจ๊ป \"์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ ์
๋๋ค!\" ๋ฐํ ํ๊ฒ ์ต๋๋ค!");
return DefaultResponse.response(409, "์ด๋ฏธ ์กด์ฌํ๋ ์ด๋ฉ์ผ ์
๋๋ค!", "Conflict");
}).orElse((findByUserInfo.filter(user -> user.getNickname().equals(duplicateByIdInfoDTO.getNickname())))
.map(user -> {
log.info("์ด๋ฏธ ์กด์ฌํ๋ ๋ณ๋ช
์
๋๋ค! 409 Code์ ํจ๊ป \"์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ ์
๋๋ค!\" ๋ฐํ ํ๊ฒ ์ต๋๋ค!");
return DefaultResponse.response(409, "์ด๋ฏธ ์กด์ฌํ๋ ๋ณ๋ช
์
๋๋ค!", "Conflict");
}).orElse(((findByUserInfo.filter(user -> user.getUserPhone().equals(duplicateByIdInfoDTO.getUserPhone()))))
.map(user -> {
log.info("์ด๋ฏธ ์กด์ฌํ๋ ํธ๋ํฐ ๋ฒํธ ์
๋๋ค! 200 Code์ ํจ๊ป \"์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ ์
๋๋ค!\" ๋ฐํ ํ๊ฒ ์ต๋๋ค!");
return DefaultResponse.response(409, "์ด๋ฏธ ์กด์ฌํ๋ ํธ๋ํฐ ๋ฒํธ ์
๋๋ค!", "Conflict");
}).orElseGet(() -> {
log.info("์ค๋ณต ๋๋ ๊ฐ์ด ์์ต๋๋ค! 200 Code์ ํจ๊ป \"์ฌ์ฉ ๊ฐ๋ฅ!\" ๋ฐํ ํ๊ฒ ์ต๋๋ค!");
return DefaultResponse.response(200, "์ฌ์ฉ ๊ฐ๋ฅ", "OK", findByUserInfo);
})));
} else {
log.info("์ด๋ฏธ ์กด์ฌํ๋ ID ์
๋๋ค! 409 Code์ ํจ๊ป \"์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ ์
๋๋ค!\" ๋ฐํ ํ๊ฒ ์ต๋๋ค!");
return DefaultResponse.response(409, "์ด๋ฏธ ์กด์ฌํ๋ ID ์
๋๋ค!", "Conflict");
} // // if-else (checkEmail.isEmpty()) ๋
} // duplicateId(String username) ๋
๐ฆ UserMapper.java
๐ฆ UserMapper.xml
๐ฝ Vue.js
๐ฆ SignUp.vue
methods: {
// ID ์ค๋ณต ํ์ธ
idCheck() {
const pattern = /^\s+|\s+$/g; // ๊ณต๋ฐฑ(Space)์ ํด๋นํ๋ ์ ๊ท ํํ์
console.log("์
๋ ฅ๋ ์ด์ฉ์๊ฐ ์ด์ฉํ๊ณ ์ ํ๋ ID ๊ฐ : " + this.inputParam.userId);
if (this.inputParam.userId === undefined || this.inputParam.userId === '' || this.inputParam.userId === null) {
console.log("ID๊ฐ ์
๋ ฅ๋์ง ์์์ต๋๋ค!")
alert("ID๋ฅผ ์
๋ ฅ ํด ์ฃผ์ธ์!")
this.$refs.userId.focus();
return false;
} // if (this.inputParam.userId === undefined || this.inputParam.userId === '') ๋
if (this.inputParam.userId.replace(pattern, '') === "") {
console.log("ID์ ๊ณต๋ฐฑ ๋ฌธ์๊ฐ ์์ต๋๋ค!")
alert("ID์๋ ๊ณต๋ฐฑ์ ์
๋ ฅํ ์ ์์ต๋๋ค!")
this.$refs.userId.focus();
return false;
} // if (this.inputParam.userId.replace(pattern, '') === "") ๋
console.log("Back End๋ก ์์ฒญ๊ณผ ํจ๊ป Data๋ฅผ ๋ณด๋ด๊ธฐ ์ Data ๊ฐ ํ์ธ : " + this.inputParam.toString())
duplicateUserIdCheck(this.inputParam).then(response => {
console.log("ID ์ค๋ณต ์์ฒญ ๋ณด๋ธ ๋ค Back End์์ ๋์์จ ์๋ต์ ํ์ธ ํฉ๋๋ค! ID ๊ฐ : " + response.data.toString());
if (response.data.statusCode === 409 || response.data.messageEn === "conflict") {
console.log("์ด๋ฏธ ๋ฑ๋ก๋ ID ์
๋๋ค!");
alert("์ด๋ฏธ ๋ฑ๋ก๋ ID ์
๋๋ค!")
this.$refs.userId.focus();
return false;
} else {
console.log("์ด์ฉ ๊ฐ๋ฅํ ID ์
๋๋ค!")
alert("์ด์ฉ ๊ฐ๋ฅํ ID ์
๋๋ค!")
return true;
}
});
}, // idCheck() ๋
๐ฝ DataBase
ํ์ฌ DB์๋ ์ด๋ ๊ฒ ํ ๊ฐ์ ๊ณ์ ๋ง ๋ฑ๋ก์ด ๋์ด ์๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ username(ID), nickname(๋ณ๋ช ), userEmail, userPhone(ํธ๋ํฐ ๋ฒํธ)๋ฅผ ์ค๋ณต ํ์ธํ์ฌ ๊ฐ์ ๊ฒ์ด ์์ผ๋ฉด ๋ค์ ๋ฑ๋กํ๋๋ก ๋ง๋ค๊ณ ์ถ์ ๊ฒ์ด์์.
โ ๏ธ ๋ฌธ์ ๋ฐ์!
์์ ๊ฐ์ด POSTMAN์ผ๋ก username(ID)๋ฅผ ๊ฒ์ฌํ๋ฉด ์ ์์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ 200 CODE๋ฅผ ๋ฐํํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
๊ทธ๋ฐ๋ฐ, ์ด๋ ๊ฒ Vue.js์์ ์ค๋ณตํ์ธ์ ํ๋ ค๊ณ ํ๋ฉด ์๊พธ ์ด๋ฏธ ๋ฑ๋ก๋์ด ์๋ค๊ณ ํด๋ฒ๋ฆฌ๋ ๊ฒ์ด์์.
2022-03-25 02:58:47.605 INFO 31480 --- [nio-8080-exec-6] c.d.j.controller.member.UserController : UserController์ duplicateId(@RequestBody String username)๊ฐ ํธ์ถ ๋์์ต๋๋ค! Client๋ก ๋ถํฐ ์ ๋ฌ๋ ๊ฐ ํ์ธ : DuplicateByIdInfoDTO(username=, nickname=, userEmail=null, userPhone=null)
2022-03-25 02:58:47.606 INFO 31480 --- [nio-8080-exec-6] c.d.j.controller.member.UserController : userService.signUp(userSignUpRequestDTO)๋ฅผ ํธ์ถํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ฒ ์ต๋๋ค!
2022-03-25 02:58:47.606 INFO 31480 --- [nio-8080-exec-6] c.d.j.service.user.UserServiceImpl : UserServiceImpl์ duplicateId(String username)๊ฐ ํธ์ถ ๋์์ต๋๋ค! Client๋ก ๋ถํฐ ์ ๋ฌ๋ ๊ฐ : DuplicateByIdInfoDTO(username=, nickname=, userEmail=null, userPhone=null)
2022-03-25 02:58:47.606 INFO 31480 --- [nio-8080-exec-6] c.d.j.service.user.UserServiceImpl : DB์์ ํ์ ๊ฐ์
์์ฒญ ์ด์ฉ์๊ฐ ์
๋ ฅํ UserId(username)๋ฅผ ํตํด ํด๋น ํ์์ด ๋ฑ๋ก ๋์ด ์๋์ง ์ฐพ๊ฒ ์ต๋๋ค!
2022-03-25 02:58:47.612 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. Connection.isValid(5) returned true
2022-03-25 02:58:47.613 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. Connection.getAutoCommit() returned true
2022-03-25 02:58:47.613 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. PreparedStatement.new PreparedStatement returned
2022-03-25 02:58:47.613 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. Connection.prepareStatement(select username, nickname, userEmail, userPhone
from user
where 1 = 1) returned net.sf.log4jdbc.sql.jdbcapi.PreparedStatementSpy@452e1a54
2022-03-25 02:58:47.613 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. PreparedStatement.setFetchSize(500) returned
2022-03-25 02:58:47.619 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. select username, nickname, userEmail, userPhone from user where 1 = 1 {executed in 5 ms}
2022-03-25 02:58:47.619 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. PreparedStatement.execute() returned true
2022-03-25 02:58:47.619 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. ResultSet.new ResultSet returned
2022-03-25 02:58:47.619 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. PreparedStatement.getResultSet() returned net.sf.log4jdbc.sql.jdbcapi.ResultSetSpy@2c8c95
2022-03-25 02:58:47.620 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. ResultSet.getMetaData() returned org.mariadb.jdbc.MariaDbResultSetMetaData@7c8f92e5
2022-03-25 02:58:47.620 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. ResultSet.getType() returned 1003
2022-03-25 02:58:47.620 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. ResultSet.isClosed() returned false
2022-03-25 02:58:47.620 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. ResultSet.next() returned true
2022-03-25 02:58:47.622 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. ResultSet.getString(username) returned ์ฃผ๋
2022-03-25 02:58:47.623 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. ResultSet.getString(nickname) returned ์ฃผ๋ํ๋
2022-03-25 02:58:47.623 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. ResultSet.getString(userEmail) returned junyharang8592@gmail.com
2022-03-25 02:58:47.623 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. ResultSet.getString(userPhone) returned 010-123-4567
2022-03-25 02:58:47.623 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 : 1. ResultSet.isClosed() returned false
2022-03-25 02:58:47.624 INFO 31480 --- [nio-8080-exec-6] log4jdbc.log4j2 :
|---------|---------|-------------------------|-------------|
|username |nickname |useremail |userphone |
|---------|---------|-------------------------|-------------|
|์ฃผ๋ |์ฃผ๋ํ๋ |junyharang8592@gmail.com |010-123-4567 |
|---------|---------|-------------------------|-------------|
์์ Console Log์์ ๋ ์ฌ๊ฒจ ๋ด์ผ ํ ๋ถ๋ถ์ด ๋ฐ๋ก ์๋์ธ ๊ฒ์ด์์.
2022-03-25 02:58:47.605 INFO 31480 --- [nio-8080-exec-6] c.d.j.controller.member.UserController : UserController์ duplicateId(@RequestBody String username)๊ฐ ํธ์ถ ๋์์ต๋๋ค! Client๋ก ๋ถํฐ ์ ๋ฌ๋ ๊ฐ ํ์ธ : DuplicateByIdInfoDTO(username=, nickname=, userEmail=null, userPhone=null)
2022-03-25 02:58:47.606 INFO 31480 --- [nio-8080-exec-6] c.d.j.controller.member.UserController : userService.signUp(userSignUpRequestDTO)๋ฅผ ํธ์ถํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ฒ ์ต๋๋ค!
2022-03-25 02:58:47.606 INFO 31480 --- [nio-8080-exec-6] c.d.j.service.user.UserServiceImpl : UserServiceImpl์ duplicateId(String username)๊ฐ ํธ์ถ ๋์์ต๋๋ค! Client๋ก ๋ถํฐ ์ ๋ฌ๋ ๊ฐ : DuplicateByIdInfoDTO(username=, nickname=, userEmail=null, userPhone=null)
๋ณด๋ฉด Client(Vue.js)์์ ์ ๋ฌ๋๋ ๊ฐ์ด ๋ชจ๋ null์ธ ๊ฒ์ ํ์ธ ํ ์ ์๋ ๊ฒ์ด์์.
์ฌ๊ธฐ์ ๋ณด๋ฉด where ์ ์ 1=1 ์ฆ, ์ฐธ์ด ๋๊ฒ ํด ๋๊ณ , if์ ๋ก ์กฐ๊ฑด์ ๋ง์ผ๋ฉด AND ์กฐ๊ฑด์ ๋ก ํด๋น ์ ๋ณด๋ฅผ ์ฐพ๊ฒ ๋ง๋ค์ด ๋ ผ๊ฒ์ด์์.
๐ค ์์ธ ๋ถ์
๊ทผ๋ฐ NULL ๊ฐ์ด ๋ค์ด์ ๋ฒ๋ฆฌ๋ ๊ฒ์ํ ๊ฒ์ ์๊ณ , where ์ ์ 1=1์ด๋ผ๊ณ ๋์ด ์์ผ๋ ๊ฒฐ๊ตญ ๋ชจ๋ Data๋ฅผ ์ฐพ๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ๋ค๋ฅธ username์ ์ ๋ ฅํ์ง๋ง, DB์์ ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ์ฐพ์์ง๋ฉด ๊ฐ์ด ์๋ค๊ณ ํ๋จํ๋ผ๊ณ Logic์ ์งฐ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ '์ด๋ฏธ ๋ฑ๋ก ๋ ID'๋ผ๊ณ ์ถ๋ ฅ์ ํด ๋ฒ๋ฆฌ๋ ๊ฒ์ด์์.
๊ทธ๋ผ ๋๋์ฒด ์ด๋ค ๋ฌธ์ ๋๋ฌธ์ ์ด์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์ผ๊น์?
๐ป ๋ฌธ์ ํด๊ฒฐ!
์ฃผ๋ํ๋์ ๊ทธ๋ผ ๋๋์ฒด ์? Client์์๋ ์ ๋๋ก ๊ฐ์ด ๋์ ธ์ง๋๋ฐ, ๋ฐ๋ ๊ณณ์์๋ ๋ชป ๋ฐ๋ ๊ฒ์ผ๊น๋ฅผ ๊ณ ๋ฏผํ๋ค๊ฐ ๋ณ์๋ช ์ ๋์ด ๊ฐ ๊ฒ์ด์์.
์ DTO๋ ํ์ ๊ฐ์ ์ ์ค๋ณต ํ์ธ์ ์ํด ํ์ํ ๊ฐ๋ค์ ๋ด๋ ๋ฑ์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ DTO Class ๊ฒ์ด์์.
Controller์์๋ ๋งค๊ฐ ๋ณ์๋ก ์ด Class๋ฅผ ๊ฐ์ฒด๋ก ๋ฐ๊ณ ์๋ ๊ฒ์ด์์.
๋ค์ ์ด ๊ณณ Vue.js Code์์ ์ฃผ๋ํ๋์ 38๋ฒ์งธ ์ค v-model์ ์ง์ค ํด ๋ณธ ๊ฒ์ด์์.
V-model์ Mapping๋ ๊ฐ์ฒด์ ID๊ฐ์ด ๋ด๊ธธ ๊ฒ์ด๊ณ ,
์ด ๊ณณ idCheck()์์ ์ฌ์ฉ์ด ๋๋ฉด์ BackEnd๋ก๋ ์ ๋ฌ์ด ๋๋ ๊ฒ์ด์์.
๊ทผ๋ฐ ๋ฌธ์ ๋ ๋ฐ๋ก Vue์ `userId`์ Spring์ `username`์ด ๋๊ฐ์ ๊ฐ์ ๋ฐ๊ณ , ๋๊ฐ์ ์ญํ ์ ํ์ง๋ง, ๊ฒฐ๋ก ์ ์ผ๋ก ์ด๋ฆ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ Vue์์๋ `userId`๋ฅผ ๋๊ฒผ์ง๋ง, Spring์ ์ด ๋ณ์๋ช ์ ๋ชฐ๋ผ `Null` ๊ฐ์ด ๋ค์ด์๋ ๊ฒ์ด์์.
์์ธ์ ํ์ ํ์ผ๋ ์ฌ๋น ๋ฅด๊ฒ ์์ ํ๊ณ , ๋ค์ Test๋ฅผ ํด๋ด์ผ ํ๊ฒ ์ด์!
์ผํธ!๐
๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ๊ฒ์ด์์!