seong
(2)블로그 만들기 - UsersService(CRUD),Api Controller 만들기 본문
설계 하기
1. 화면 설계서 (UI)
2. DB 설계
3. 기능 정의 - 모든 기능 다 적기(회원가입, 로그인 , 회원탈퇴 등등)
4. 화면과 기능 매칭
5. 프로그램 만들기 - 수정 보완 ( 애자일 기법으로 추천!)
1. Entity만들기
package site.metacoding.red.domain.boards;
import java.sql.Time;
import java.sql.Timestamp;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Boards {
private Integer id;
private String title;
private String content;
private Integer usersId;
private Timestamp createdAt; // At은 시분초 표현. Dt 년 월 일
}
2. Dao 만들기
mapper에 IOC 컨테이너에 띄우기 위해 interface로 만든다.
처음 생성 할 때 Dto를 생각하지 말고 모두 기본 값으로 넣고 추후 기능 만들면서 수정
BoardsDao
package site.metacoding.red.domain.boards;
import java.util.List;
public interface BoardsDao {
public void insert(Boards boards);
public List<Boards> findAll();
public Boards findById(Integer id);
public void update(Boards boards);
public void deleteById(Integer id);
}
UsersDao
package site.metacoding.red.domain.users;
import java.util.List;
public interface UsersDao {
public void insert(Users users);
public List<Users> findAll();
public Users findById(Integer id);
public void update(Users users);
public void deleteById(Integer id);
}
3. Service 패키지 작성 ( 첫 연습은 테이블 명 대로 만들어보기)
서비스 만들땐 어노테이션으로 @Service를 붙여준다.
현재 Boards, Users테이블이 두개 있으므로 두개의 서비스를 작성
UsersService
package site.metacoding.red.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import lombok.RequiredArgsConstructor;
import site.metacoding.red.domain.boards.BoardsDao;
import site.metacoding.red.domain.users.Users;
import site.metacoding.red.domain.users.UsersDao;
import site.metacoding.red.web.request.users.InsertDto;
import site.metacoding.red.web.request.users.LoginDto;
import site.metacoding.red.web.request.users.UpdateDto;
@RequiredArgsConstructor
@Service
public class UsersService {
private final UsersDao usersDao;
private final BoardsDao boardsDao;
public void 회원가입(InsertDto insertDto) { // username, password, email -> id,creatAt은 받지 않으므로 Dto만들어서 넘겨준다.
// 클라이언트가 Dto를 요청 -> Service에서 Entity로 바꾸어 수행
// 1. Dto를 엔티티로 변경하는 코드
// 2. 엔티티로 insert
usersDao.insert(insertDto.toEntity());
}
public Users 로그인(LoginDto loginDto) {// Dto username, password
Users usersPS = usersDao.findByUsername(loginDto.getUsername());
// 1. if로 usersPs의 password와 Dto password 비교
if(usersPS.getPassword() != loginDto.getPassword()) {
return null;
}
return null;
}
public void 회원수정(Integer id, UpdateDto updateDto) {// id, 디티오(password, email)
// 1. 영속화
Users usersPS = usersDao.findById(id);
// 2. 영속화 된 객체 변경
usersPS.updatePasswordEmail(updateDto);
// 3. DB 수행 update
usersDao.update(usersPS);
}
/*
* 1. deleteById가 실행 할 때 트랜잭션이 실행된다
* 2. delete가 끝나면 그 트랜젝션을 타고 아래 boards가 들어와서 실행된다
* 3. 여기서 실패 할 시 트랜젝션 종료하고 rollback
* */
@Transactional(rollbackFor = RuntimeException.class) // 트랜젝션이 실패 하면 rollback 한다.
public void 회원탈퇴(Integer id) { //users - delete, boards - update 모두 연결 users 삭제 -> boards의 usersid를 null로 바꾼다.
//
usersDao.deleteById(id);
boardsDao.updateByUsersId(id);// mybaties에서 for문 돌려서 업데이트
}
/**
* public void 로그아웃() {} 로그아웃은 DB와 연결되는 것이 아니기 때문에 컨트롤러에서 만들어준다.
* 톰캣에서 만들어주는 response , request가 생성되는 것은 모두 서비스에 넘겨주지 말아야한다.
* 즉 DB와 연관 없는 것은 Service에 작성 하지 않는다.
**/
public boolean 아이디중복확인(String username) {
Users usersPS = usersDao.findByUsername(username);
// 있으면 true, 없으면 false 리턴
if(usersPS == null) {
return false;
}else {
return true;
}
}
public Users 회원정보보기(Integer id) {
Users usersPS = usersDao.findById(id);
return usersPS;
}
}
4. 쿼리 작성
<?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="site.metacoding.red.domain.users.UsersDao">
<insert id="insert">
INSERT INTO users(username, password, email, createdAt)
VALUES(#{username}, #{password}, #{email}, now());
</insert>
<select id="findById" resultType="site.metacoding.red.domain.users.Users">
SELECT * FROM users WHERE id = #{id}
</select>
<select id="findAll" resultType="site.metacoding.red.domain.users.Users">
SELECT * FROM users ORDER BY id DESC
</select>
<insert id="update">
UPDATE users SET password = #{password}, email = #{email}
WHERE id = #{id}
</insert>
<delete id="deleteById">
DELETE FROM users WHERE id = #{id}
</delete>
<select id="findByUsername" resultType="site.metacoding.red.domain.users.Users">
SELECT * FROM users WHERE username = #{username}
</select>
</mapper>
5. 각 기능 테스트
- 현재 View(jsp) 로 넘겨주고 확인을 하지 않기 때문에 RestCotroller로 데이터로 확인
- Postman으로 테스트
1. 회원가입
2. 로그인
3. 회원정보 보기
4. 회원 수정
5. 회원 탈퇴
6. 유저 네임 중복
'Spring > 블로그 만들기' 카테고리의 다른 글
(6)블로그만들기 Ajax - 로그인 ,회원 탈퇴, 업데이트 (0) | 2022.09.15 |
---|---|
(5)블로그만들기 Ajax 통신 - UserName 중복체크, 회원가입(join) (0) | 2022.09.15 |
(4)블로그만들기 - BoardsService (0) | 2022.09.14 |
(3)블로그 만들기 - UsersController , JS 활용하기 (0) | 2022.09.13 |
(1)블로그 만들기 - MariaDB 설치 (0) | 2022.09.13 |