seong

(2)블로그 만들기 - UsersService(CRUD),Api Controller 만들기 본문

Spring/블로그 만들기

(2)블로그 만들기 - UsersService(CRUD),Api Controller 만들기

hyeonseong 2022. 9. 13. 15:28

 

설계 하기

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. 회원가입

Controller
결과

2. 로그인 

Controller
결과

3. 회원정보 보기

Controller
결과

4. 회원 수정

Controller
결과

5. 회원 탈퇴

Controller
결과

6. 유저 네임 중복

Controller
결과