인터페이스 6일차 (회원가입 및 중복여부확인 Create, Read)

2023. 1. 10. 12:41코딩배움일지/인터페이스 구현

UserController

package com.jingu.board.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.jingu.board.dto.response.ResponseDto;
import com.jingu.board.dto.user.PostUserDto;
import com.jingu.board.dto.user.PostUserResponseDto;
import com.jingu.board.service.UserService;

@RestController
@RequestMapping("api/user/") // post 로 요청을 보낸다.
public class UserController {  // 회원가입 프로세스
	
	@Autowired UserService userService; // ; 찍으면 저장해라 가만두지 않겠다.
	
	@PostMapping("")
	public ResponseDto<PostUserResponseDto> postUser(@RequestBody PostUserDto requestBody){
		return userService.postUser(requestBody);
	}

}

 

User Service

 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jingu.board.dto.response.ResponseDto;
import com.jingu.board.dto.user.PostUserDto;
import com.jingu.board.dto.user.PostUserResponseDto;
import com.jingu.board.entity.MemberEntity;
import com.jingu.board.repository.MemberRepository;

@Service
public class UserService { 
	
	@Autowired MemberRepository memberRepository;
	public ResponseDto<PostUserResponseDto> postUser(PostUserDto dto){ //모든 메소드는 검증 해야한다.
		String password = dto.getPassword();
		String password2 = dto.getPassword2();
		
		if(!password.equals(password2)) return ResponseDto.setFailed("비밀번호가 서로 다릅니다.");
		
		MemberEntity member = MemberEntity //MemberEntity 를 통해서
				.builder() //빌드를 하고 실제 Entity 가 만들어진다. 
				.email(dto.getEmail())
				.password(dto.getPassword())
				.nickname(dto.getNickname())
				.telNumber(dto.getTelNumber())
				.address(dto.getAddress() + " " + dto.getAddressDetail())
				.build();
		
		memberRepository.save(member); // DB 에 save
		
		return ResponseDto.setSuccess("회원가입에 성공했습니다.", new PostUserResponseDto(true));
	}
}

 

// JpaRepository.save(Entity) 메서드

// 해당 Entity Id가 데이터베이스 테이블에 존재하지 않으면!

// Entity INSERT 작업을 수행

// 하지만!!!

// 해당 Entity Id가 데이터베이스 테이블에 존재하면!

// 존재하는 Entity UPDATE 작업을 수행

 

새로 입력

 

전에 입력한 것

 

비밀번호가 바뀌었다.

중복이 일어나면 Failed Response 를 해야한다.

 

String email = dto.getEmail();
		MemberEntity member = memberRepository.findById(email).get();
        
        member = MemberEntity  //MemberEntity 를 통해서 //MemberEntity member = MemberEntity 오류남

 

package com.jingu.board.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jingu.board.dto.response.ResponseDto;
import com.jingu.board.dto.user.PostUserDto;
import com.jingu.board.dto.user.PostUserResponseDto;
import com.jingu.board.entity.MemberEntity;
import com.jingu.board.repository.MemberRepository;

@Service
public class UserService { 
	
	@Autowired MemberRepository memberRepository;
	public ResponseDto<PostUserResponseDto> postUser(PostUserDto dto){ //모든 메소드는 검증 해야한다.
		// 데이터베이스에 해당 이메일이 존재하는지 체크
		// 존재한다면 Failed Response 를 반환
		// Select * From m Where email =? 
		//결과가 존재하느냐? 존재하지 않으면 중복되지 않는다. 그래서 존재하면 중복되지 않게해야함
		String email = dto.getEmail();
		MemberEntity member = memberRepository.findById(email).get();
		
		String password = dto.getPassword();
		String password2 = dto.getPassword2();
		
		if(!password.equals(password2)) return ResponseDto.setFailed("비밀번호가 서로 다릅니다.");
		
		member = MemberEntity  //MemberEntity 를 통해서 //MemberEntity member = MemberEntity 오류남
				.builder()  //빌드를 하고 실제 Entity 가 만들어진다.
				.email(dto.getEmail())
				.password(dto.getPassword())
				.nickname(dto.getNickname())
				.telNumber(dto.getTelNumber())
				.address(dto.getAddress() + " " + dto.getAddressDetail())
				.build();
		
		// JpaRepository.save(Entity) 메서드
		// 해당 Entity Id가 데이터베이스 테이블에 존재하지 않으면!
		// Entity INSERT 작업을 수행
		// 하지만!!! 
		// 해당 Entity Id가 데이터베이스 테이블에 존재하면!
		// 존재하는 Entity UPDATE 작업을 수행
		memberRepository.save(member); // DB 에 save
		
		return ResponseDto.setSuccess("회원가입에 성공했습니다.", new PostUserResponseDto(true));
	}
}

에러

try {
			MemberEntity member = memberRepository.findById(email).get();
		}catch(Exception e){
			return ResponseDto.setFailed("이미 존재하는 이메일 입니다.");
		}
        
        // 이렇게 하면
        
        MemberEntity member = MemberEntity  //MemberEntity 를 통해서 //MemberEntity member = MemberEntity 오류남
				.builder()  //빌드를 하고 실제 Entity 가 만들어진다.
				.email(dto.getEmail())
				.password(dto.getPassword())
				.nickname(dto.getNickname())
				.telNumber(dto.getTelNumber())
				.address(dto.getAddress() + " " + dto.getAddressDetail())
				.build(); 
                //이렇게 하던가
                
//
//이렇게 하던가
try {
			if(memberRepository.existsById(email))
				return ResponseDto.setFailed("이미 존재하는 이메일 입니다.");
		}catch(Exception e){
			return ResponseDto.setFailed("데이터베이스 오류 입니다.");
		}

///////////////////////

package com.jingu.board.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jingu.board.dto.response.ResponseDto;
import com.jingu.board.dto.user.PostUserDto;
import com.jingu.board.dto.user.PostUserResponseDto;
import com.jingu.board.entity.MemberEntity;
import com.jingu.board.repository.MemberRepository;

@Service
public class UserService { 
	
	@Autowired MemberRepository memberRepository;
	public ResponseDto<PostUserResponseDto> postUser(PostUserDto dto){ //모든 메소드는 검증 해야한다.
		// 데이터베이스에 해당 이메일이 존재하는지 체크
		// 존재한다면 Failed Response 를 반환
		// Select * From m Where email =? 
		//결과가 존재하느냐? 존재하지 않으면 중복되지 않는다. 그래서 존재하면 중복되지 않게해야함
		String email = dto.getEmail();
		
		//if(memberRepository.existsById(email))
		//	return ResponseDto.setFailed("이미 존재하는 이메일 입니다."); 이렇게해도 된다만
		// try catch 문 안에 넣어야 한다.
		
		try {
			if(memberRepository.existsById(email))
				return ResponseDto.setFailed("이미 존재하는 이메일 입니다.");
		}catch(Exception e){
			return ResponseDto.setFailed("데이터베이스 오류 입니다.");
		}
		
//		try {
//			MemberEntity member = memberRepository.findById(email).get();
//		}catch(Exception e){
//			return ResponseDto.setFailed("이미 존재하는 이메일 입니다.");
//		}
		
		
		String password = dto.getPassword();
		String password2 = dto.getPassword2();
		
		if(!password.equals(password2)) return ResponseDto.setFailed("비밀번호가 서로 다릅니다.");
		
		MemberEntity member = MemberEntity  //MemberEntity 를 통해서 //MemberEntity member = MemberEntity 오류남
				.builder()  //빌드를 하고 실제 Entity 가 만들어진다.
				.email(dto.getEmail())
				.password(dto.getPassword())
				.nickname(dto.getNickname())
				.telNumber(dto.getTelNumber())
				.address(dto.getAddress() + " " + dto.getAddressDetail())
				.build();
		
		// JpaRepository.save(Entity) 메서드
		// 해당 Entity Id가 데이터베이스 테이블에 존재하지 않으면!
		// Entity INSERT 작업을 수행
		// 하지만!!! 
		// 해당 Entity Id가 데이터베이스 테이블에 존재하면!
		// 존재하는 Entity UPDATE 작업을 수행
		memberRepository.save(member); // DB 에 save
		
		return ResponseDto.setSuccess("회원가입에 성공했습니다.", new PostUserResponseDto(true));
	}
}

Auth Service

	
	public ResponseDto<LoginDto> login(AuthPostDto dto){
		
		// 입력받은 email 으로 데이터베이스에서 검색
		String email = dto.getEmail();		
		MemberEntity member;
		
		// 존재하지 않는다면 없는 아이디 "로그인 실패" 반환
		try {
			member = memberRepository.findById(email).get();
		} catch(Exception e) {
			return ResponseDto.setFailed("Login info is not matched");
		}
		// 존재한다면 입력받은 패스워드와 받아온 패스워드와 동일한지 검사
		// 동일하지 않다면 " 로그인 실패" 반환
		String password = dto.getPassword();
		String dbPassword = member.getPassword();
		if(!password.equals(dbPassword))
			return ResponseDto.setFailed("Login Failed");
		
		
		// 토큰 생성후 토큰 및 만료시간 반환
		
		LoginDto result = new LoginDto("JWT",3600000);
		return ResponseDto.setSuccess("", result);
	}

}

/////////////////////////////////////////////////////////////

package com.jingu.board.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jingu.board.dto.auth.GetUserResponseDto;
import com.jingu.board.dto.response.ResponseDto;
import com.jingu.board.dto.user.PostUserDto;
import com.jingu.board.dto.user.PostUserResponseDto;
import com.jingu.board.entity.MemberEntity;
import com.jingu.board.repository.MemberRepository;

@Service
public class UserService { // C, R 을 했다.

	@Autowired
	MemberRepository memberRepository;

	public ResponseDto<GetUserResponseDto> getUser(String email) {


		// 해당 이메일을 데이터베이스에서 검색
		MemberEntity member;

		try {
			member = memberRepository.findById(email).get();
		}
		// 존재하지 않으면 "Not Exist User" 메세지를 포함한 Failed Response 반환
		catch (Exception e) {

			return ResponseDto.setFailed("Not Exist User");
		}
        	// 존재하면 User정보 반환
        	return ResponseDto.setSuccess("Get User Success", new GetUserResponseDto(member));
		}

//////////////////////////////////////////////////////////////////////

		// 존재하면 User정보 반환
		//1
//		GetUserResponseDto responseData = new GetUserResponseDto();
//		responseData.setEmail(member.getEmail());
//		responseData.setNickName(member.getNickname());
//		responseData.setProfile(member.getProfile());
//		responseData.setTelNumber(member.getTelNumber());
//		responseData.setAddress(member.getAddress());
//		
//		return ResponseDto.setSuccess("Get User Success", responseData);
		
		//2 GetUserResponseDto 에 builder 가 있어야 한다.
//		GetUserResponseDto responseData =
//				GetUserResponseDto
//				.builder()
//				.email(member.getEmail())
//				.nickName(member.getNickname())
//				.profile(member.getProfile())
//				.telNumber(member.getTelNumber())
//				.address(member.getAddress())
//				.build();
//		return ResponseDto.setSuccess("Get User Success", responseData);
		
		//3
//		return ResponseDto.setSuccess("Get User Success", 
//				new GetUserResponseDto(
//						member.getEmail(),
//						member.getNickname(),
//						member.getProfile(),
//						member.getTelNumber(),
//						member.getAddress()
//						)
//				);

 

GetUserResponse

package com.jingu.board.dto.auth;

import com.jingu.board.entity.MemberEntity;

import lombok.AllArgsConstructor;
//import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
//@Builder
public class GetUserResponseDto { //생성자 get set constructor 만드는 대신 annotation
	private String email;
	private String nickName;
	private String profile;
	private String telNumber;
	private String address;
	
	public GetUserResponseDto(MemberEntity member) { // 생성자 필요한 형태로 가져다 쓴다.
		this.email = member.getEmail();
		this.nickName = member.getNickname();
		this.profile = member.getProfile();
		this.telNumber = member.getTelNumber();
		this.address = member.getAddress();
		
	}
}

 

실제로는 이렇게 안한다.