Skip to content

Commit

Permalink
UMC-EWHA#31 Feat: Upload UserDao
Browse files Browse the repository at this point in the history
  • Loading branch information
JoongHyun-Kim committed Nov 26, 2022
1 parent f9598ac commit d355469
Showing 1 changed file with 135 additions and 0 deletions.
135 changes: 135 additions & 0 deletions src/main/java/umc/crud/src/user/UserDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package umc.crud.src.user;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import umc.crud.src.user.model.*;

import javax.sql.DataSource;
import java.util.List;

@Repository

/**
* DAO
* 데이터베이스 관련 작업을 전담하는 클래스
* 데이터베이스에 연결하여 입력, 수정, 삭제, 조회 등의 작업을 수행
*/
public class UserDao {
private JdbcTemplate jdbcTemplate;

@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}

/**
* DAO 관련 함수코드의 전반부는 크게 String ~~~Query와 Object[] ~~~~Params, jdbcTemplate 함수로 구성되어 있습니다.(보통은 동적 쿼리문이지만, 동적쿼리가 아닐 경우, Params부분은 없어도 됩니다.)
* Query 부분은 DB에 SQL요청을 할 쿼리문을 의미하는데, 대부분의 경우 동적 쿼리(실행할 때 값이 주입되어야 하는 쿼리) 형태입니다.
* 그래서 Query의 동적 쿼리에 입력되어야 할 값들이 필요한데 그것이 Params 부분입니다.
* Params 부분은 클라이언트의 요청에서 제공하는 정보(~~~~Req.java에 있는 정보)로 부터 getXXX를 통해 값을 가져옵니다. ex) getEmail -> email값을 가져옵니다.
* Notice!
* get과 get의 대상은 카멜케이스로 작성됩니다. ex) item -> getItem, password -> getPassword, email -> getEmail, userIdx -> getUserIdx
* 그 다음 GET, POST, PATCH 메소드에 따라 jabcTemplate의 적절한 함수(queryForObject, query, update)를 실행시킵니다.(DB 요청이 일어납니다.)
* Notice!
* POST, PATCH의 경우 jdbcTemplate.update
* GET은 대상이 하나일 경우 jdbcTemplate.queryForObject, 대상이 복수일 경우 jdbcTemplate.query 함수를 사용합니다.
* jdbcTemplate이 실행시킬 때 Query 부분과 Params 부분은 매핑(값을 주입)시켜서 DB에 요청합니다.
*
* 정리하자면 < 동적 쿼리문 설정(Query) -> 주입될 값 설정(Params) -> jdbcTemplate함수(Query, Params)를 통해 Query, Params를 대응시켜 DB에 요청 > 입니다.
*
* DAO 관련 함수코드의 후반부는 전반부 코드를 실행시킨 후 어떤 결과값을 반환(return)할 것인지를 결정합니다.
* 어떠한 값을 반환할 것인지 정의한 후, return 문에 전달하면 됩니다.
* ex) return this.jdbcTemplate.query( ~~~~ ) -> ~~~~쿼리문을 통해 얻은 결과를 반환합니다.
*/

/**
* 참고 링크
* https://jaehoney.tistory.com/34 -> JdbcTemplate 관련 함수
* https://velog.io/@seculoper235/RowMapper%EC%97%90-%EB%8C%80%ED%95%B4 -> RowMapper
*/

// 회원가입
public int createUser(PostUserReq postUserReq) {
String createUserQuery = "insert into User (email, password, nickname) VALUES (?,?,?)";
Object[] createUserParams = new Object[]{postUserReq.getEmail(), postUserReq.getPassword(), postUserReq.getNickname()}; // 동적 쿼리의 ?부분에 주입될 값
this.jdbcTemplate.update(createUserQuery, createUserParams);
// email -> postUserReq.getEmail(), password -> postUserReq.getPassword(), nickname -> postUserReq.getNickname() 로 매핑한 다음 쿼리문 실행
// 즉, DB의 User Table에 (email, password, nickname)값을 가지는 유저 데이터를 삽입(생성)한다.

String lastInsertIdQuery = "select last_insert_id()"; // 가장 마지막에 삽입된(생성된) id값을 가져온다.
return this.jdbcTemplate.queryForObject(lastInsertIdQuery, int.class); // 해당 쿼리문의 결과 마지막으로 삽인된 유저의 userIdx번호를 반환한다.
}

// 이메일 확인
public int checkEmail(String email) {
String checkEmailQuery = "select exists(select email from User where email = ?)";
String checkEmailParams = email; // 확인할 이메일 값
return this.jdbcTemplate.queryForObject(checkEmailQuery,
int.class,
checkEmailParams); // checkEmailQuery, checkEmailParams를 통해 가져온 값(int)을 반환한다. -> 쿼리문의 결과(존재하지 않음(False, 0),존재함(True, 1))를 int형(0,1)으로 반환
}

// 회원정보 변경 (nickname 변경)
public int modifyUserName(PatchUserReq patchUserReq) {
String modifyUserNameQuery = "update User set nickname = ? where userIdx = ? ";
Object[] modifyUserNameParams = new Object[]{patchUserReq.getNickname(), patchUserReq.getUserIdx()}; // 주입될 값들(nickname, userIdx) 순

return this.jdbcTemplate.update(modifyUserNameQuery, modifyUserNameParams); // 매핑시켜 쿼리 요청(생성했으면 1, 실패했으면 0)
}


// 로그인: 해당 email에 해당되는 user의 암호화된 비밀번호 값을 가져온다.
public User getPwd(PostLoginReq postLoginReq) {
String getPwdQuery = "select userIdx, password,email,nickname from User where email = ?";
String getPwdParams = postLoginReq.getEmail(); // 주입될 email값을 클라이언트의 요청에서 가져온다.

return this.jdbcTemplate.queryForObject(getPwdQuery,
(rs, rowNum) -> new User(
rs.getInt("userIdx"),
rs.getString("email"),
rs.getString("password"),
rs.getString("nickname")
),
getPwdParams
); // 한 개의 회원정보를 얻기 위한 jdbcTemplate 함수(Query, 객체 매핑 정보, Params)의 결과 반환
}

// User 테이블에 존재하는 전체 유저들의 정보 조회
public List<GetUserRes> getUsers() {
String getUsersQuery = "select * from User";
return this.jdbcTemplate.query(getUsersQuery,
(rs, rowNum) -> new GetUserRes(
rs.getInt("userIdx"),
rs.getString("nickname"),
rs.getString("Email"),
rs.getString("password"))
); // 복수개의 회원정보를 얻기 위해 jdbcTemplate 함수(Query, 객체 매핑 정보)의 결과 반환(동적쿼리가 아니므로 Parmas부분이 없음)
}

// 해당 nickname을 갖는 유저들의 정보 조회
public List<GetUserRes> getUsersByNickname(String nickname) {
String getUsersByNicknameQuery = "select * from User where nickname =?";
String getUsersByNicknameParams = nickname;
return this.jdbcTemplate.query(getUsersByNicknameQuery,
(rs, rowNum) -> new GetUserRes(
rs.getInt("userIdx"),
rs.getString("nickname"),
rs.getString("Email"),
rs.getString("password")),
getUsersByNicknameParams); // 해당 닉네임을 갖는 모든 User 정보를 얻기 위해 jdbcTemplate 함수(Query, 객체 매핑 정보, Params)의 결과 반환
}

// 해당 userIdx를 갖는 유저조회
public GetUserRes getUser(int userIdx) {
String getUserQuery = "select * from User where userIdx = ?";
int getUserParams = userIdx;
return this.jdbcTemplate.queryForObject(getUserQuery,
(rs, rowNum) -> new GetUserRes(
rs.getInt("userIdx"),
rs.getString("nickname"),
rs.getString("Email"),
rs.getString("password")),
getUserParams); // 한 개의 회원정보를 얻기 위한 jdbcTemplate 함수(Query, 객체 매핑 정보, Params)의 결과 반환
}
}

0 comments on commit d355469

Please sign in to comment.