[20230721] 클라우드 플랫폼 기반 웹서비스 개발자 양성 과정 12일차. [20230725] 클라우드 플랫폼 기반 웹서비스 개발자 양성 과정 13일차. [20230726] 클라우드 플랫폼 기반 웹서비스 개발자 양성 과정 14일차.

양희정·2023년 7월 25일
0

오늘의 과정 목록

  • bord 프로젝트

Bord 프로젝트

  • 패키지 양식
    com.회사명.프로젝트명

  • 레이어(구역)
    controller (입 출력 / 입출력에 대한 검증)
    service (실제 비즈니스 로직(연산담당))
    repository (데이터베이스(DBS) 접근)

  • 구역간의 데이터 이동 개체. 관리하고자 하는 물체를 정의해 놓은 것.
    ex) 회원을 정하는 것, 게시물을 정하는 것.
    dto (client - controller - service 간의 데이터 전송)
    entity (service - repository - database 간의 데이터 전송)

  • 동작. 제공한다, 작업한다, 필터링한다.
    Provider (데이터 제공)
    Handler (이벤트 발생시 대처 혹은 작업)
    Filter (서비스 이용 필터링)

  • common / Utill ((연산. 특정단어 저장. 단순한 용도. 잡종. )기타등등)

  • 기능에 대한 이름
    회원가입 기능 (사용자가 입력해야 하는 정보) (SignUpRequestDto)
    이메일 주소
    비밀번호
    비밀번호 확인
    닉네임
    핸드폰 번호
    주소
    상세주소
    개인정보동의 여부
    - SignUpResponseDto
    - 회원가입 성공

  • 회원가입 실패
    이메일 미입력
    이메일 주소 포맷
    중복된 이메일
    비밀번호 길이 8자 이하일 때 (미만 아닐..까?)
    비밀번호 불일치
    빈 닉네임
    휴대폰 번호 미입력
    휴대폰 번호 숫자가 아님
    우편번호 입력하지 않았을 때
    개인정도 동의 미체크

  • 로직상 문제
    휴대폰 번호 중복
    (닉네임 중복)
    데이터베이스 오류

-회원 (User)
이메일 / 비밀번호 / 닉네임 / 휴대전화번호 / 주소 / 상세주소 / 개인정보동의 여부 / 프로필 사진

  • 게시물 (Board)
    게시물 번호 / 제목 / 내용 / 작성일 / 작성자 이메일 / [작성자 닉네임] / 작성자 프로필 사진 / 댓글 / 좋아요 / 조회수 / 게시물 이미지(여러개) / [좋아요한 사용자의 이메일] / 좋아요한 사용자의 닉네임 / 좋아요한 사용자의 프로필 사진 / 댓글 작성자의 프로필 사진 / 댓글 작성 시간 / 댓글 작성자의 닉네임 / 댓글 내용

  • 검색어 (누적로그에 대한 개념) (SearchWord)
    검색어 / 이전 검색어 / 다음 검색어 /

  • 로그인 기능

이메일 주소
비밀번호
{
이메일: 문자열
비밀번호: 문자열
}

  • 로그인 결과

성공
유저 정보 반환
{
상태: 정수
메세지: 문자열
이메일: 문자열
닉네임: 문자열
프로필사진: 문자열
}

실패
로그인 정보불일치
필수 데이터 미입력
데이터베이스 에러
{
상태: 정수
메세지: 문자열
}

com.yhj.board

  • BoardApplication
package com.yhj.board;

import java.util.Scanner;

import com.yhj.board.controller.UserController;
import com.yhj.board.controller.implement.UserControllerImplement;
import com.yhj.board.dto.request.SignInRequestDto;
import com.yhj.board.dto.request.SignUpRequestDto;
import com.yhj.board.dto.response.ResponseEntity;
import com.yhj.board.dto.response.SignInResponseDto;
import com.yhj.board.dto.response.SignUpResponseDto;
import com.yhj.board.repository.UserRepository;
import com.yhj.board.repository.implement.UserRepositoryImplement;
import com.yhj.board.service.UserService;
import com.yhj.board.service.implement.UserServiceImplement;

public class BoardApplication {
	
	static UserRepository userRepository = new UserRepositoryImplement();
	static UserService userService = new UserServiceImplement(userRepository);
	static UserController userController = new UserControllerImplement(userService);
	
	public static void main(String[] args) {
		
		while (true) {
			Scanner scanner = new Scanner(System.in);
			
			System.out.println("작업 : ");
			String method = scanner.nextLine();
			
			if(method.equals("end")) break;
			if(method.equals("POST /sign-up")) signUp();
			if(method.equals("POST /sign-in")) signIn();
		}
	}
	
	static void signUp() {
		
		Scanner scanner = new Scanner(System.in);
		SignUpRequestDto dto = new SignUpRequestDto();
		
		try {
			
			System.out.println("이메일 : ");
			dto.setEmail(scanner.nextLine());
			System.out.println("비밀번호 : ");
			dto.setPassword(scanner.nextLine());
			System.out.println("비밀번호 확인 : ");
			dto.setPasswordCheck(scanner.nextLine());
			System.out.println("닉네임 : ");
			dto.setNickname(scanner.nextLine());
			System.out.println("전화번호 : ");
			dto.setTelNumber(scanner.nextLine());
			System.out.println("주소 : ");
			dto.setAddress(scanner.nextLine());
			System.out.println("상세 주소 : ");
			dto.setAddressDetail(scanner.nextLine());
			System.out.println("개인정보 처리 동의 : ");
			dto.setAgreedPersonal(scanner.nextBoolean());
			
		} catch (Exception exception) {
			System.out.println("입력 중 오류 발생!");
			return;
		}
		
		ResponseEntity<SignUpResponseDto> result = userController.signUp(dto);
		System.out.println(result.toString());
	}
	
	static void signIn() {
		
		Scanner scanner = new Scanner(System.in);
		
		SignInRequestDto dto = new SignInRequestDto();
		
		try {
			System.out.println("이메일 : ");
			dto.setEmail(scanner.nextLine());
			System.out.println("비밀번호 : ");
			dto.setPassword(scanner.nextLine());
			
		} catch (Exception exception) {
			System.out.println("입력 중 오류 발생!");
			return;
		}
		
		ResponseEntity<SignInResponseDto> result = userController.signIn(dto);
		System.out.println(result.toString());
		
	}
	
}

com.yhj.board.common

  • BoardIndex
package com.yhj.board.common;

public class BoardIndex {
	public static int index = 1;
}
  • PatternValidator
package com.yhj.board.common;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternValidator {
	// 아이디@공급자/회사명.com(.net/.co.kr/.og.kr/ 등등) 정규식은 이러한 패턴을 정리할 때 특수한 패턴을 가질 때 사용한다.
	public static final String EMAIL_REGEX =
	        "^[a-zA-Z0-9_+&*-]+(?:\\." +
	        "[a-zA-Z0-9_+&*-]+)*@" +
	        "(?:[a-zA-Z0-9-]+\\.)+[a-z" +
	        "A-Z]{2,7}$";
	public static final String TEL_NUMBER_REGEX = "^[0-9]{11,12}$";
	
	public static boolean isValideEmail(String email) {
		Pattern pattern = Pattern.compile(EMAIL_REGEX);
	    Matcher matcher = pattern.matcher(email);
	    boolean emailCheck = matcher.matches();
	    return emailCheck;
	}
	
	public static boolean isValideTelNumber(String telNumber) {
		Pattern pattern = Pattern.compile(TEL_NUMBER_REGEX);
		Matcher matcher = pattern.matcher(telNumber); 
	    boolean telNumberCheck = matcher.matches();
	    return telNumberCheck;
	}
}
  • ResponseMessage
package com.yhj.board.common;

public interface ResponseMessage {
	String SUCCESS = "성공입니다.";
	
	String NOT_VALID_VALUE = "올바르지 않은 입력입니다.";
	String EXISTED_EMAIL = "이미 존재하는 이메일입니다.";
	String EXISTED_TEL_NUMBER = "이미 존재하는 전화번호입니다.";
	String EXISTED_NICKNAME = "이미 존재하는 닉네임입니다.";
	
	String SIGN_IN_FAILED = "로그인 정보가 일치하지 않습니다.";
	
	String DATABASE_ERROR = "데이터베이스 오류입니다.";
	
}

com.yhj.board.controller

  • UserController
package com.yhj.board.controller;

import com.yhj.board.dto.request.SignInRequestDto;
import com.yhj.board.dto.request.SignUpRequestDto;
import com.yhj.board.dto.response.ResponseEntity;
import com.yhj.board.dto.response.SignInResponseDto;
import com.yhj.board.dto.response.SignUpResponseDto;

public interface UserController {
	
//	public abstract - 굳이 적지 않아도 되지만 알고는 있자.
	
	ResponseEntity<SignUpResponseDto> signUp(SignUpRequestDto requestDto);
	ResponseEntity<SignInResponseDto> signIn(SignInRequestDto requestDto); // 업캐스팅으로 자동으로 반환된다. -> 받는 부분에서 문제가 발생한다.
}

// ResponseDto :	  int status, String message
// SignUpRequestDto : int status, String message, String email, String nickname, String profileImage

/*
 * ResponseDto라고 했지만 SignUpRequestDto 인스턴스를 사용할 수 있다.
 * 다운 캐스팅이 필요하지만 코드가 불안정해질 수 있다.
 * 제너릭을 사용하여 확장에 대한 개념을 이어간다.
 */

board.controller.implement

  • UserControllerImplement
package com.yhj.board.controller.implement;

import com.yhj.board.controller.UserController;
import com.yhj.board.dto.request.SignInRequestDto;
import com.yhj.board.dto.request.SignUpRequestDto;
import com.yhj.board.dto.response.ResponseEntity;
import com.yhj.board.dto.response.SignInResponseDto;
import com.yhj.board.dto.response.SignUpResponseDto;
import com.yhj.board.service.UserService;

public class UserControllerImplement implements UserController {
	
	private final UserService userService;
	
	public UserControllerImplement(UserService userService) {
		this.userService = userService;
	}

	@Override
	public ResponseEntity<SignUpResponseDto> signUp(SignUpRequestDto requestDto) {
		
		boolean isValid = requestDto.valid();
		if(!isValid) return ResponseEntity.badRequest();
		
		ResponseEntity<SignUpResponseDto> result = userService.signUp(requestDto);
		return result;
	}

	@Override
	public ResponseEntity<SignInResponseDto> signIn(SignInRequestDto requestDto) {
		boolean isValid = requestDto.valid();
		if(!isValid) return ResponseEntity.badRequest();
		
		ResponseEntity<SignInResponseDto> result = userService.signIn(requestDto);
		return result;
	}

}

com.yhj.board.dto.request

  • SignInRequestDto
package com.yhj.board.dto.request;

public class SignInRequestDto {

	private String email;
	private String password;
	
	public SignInRequestDto() {}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	public boolean valid() {
		if(email == null || password == null) return false;
		if(email.isBlank() || password.isBlank()) return false;
		return true;
	}
	
}
  • SignUpRequestDto
package com.yhj.board.dto.request;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.yhj.board.common.PatternValidator;

// 닉네임 / 핸드폰 번호 / 주소 / 상세주소 / 개인정보동의 여부
public class SignUpRequestDto {
	
	private String email;
	private String password;
	private String passwordCheck;
	private String nickname;
	private String telNumber;
	private String address;
	private String addressDetail;
	private boolean agreedPersonal;

	public SignUpRequestDto() {
		
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPasswordCheck() {
		return passwordCheck;
	}

	public void setPasswordCheck(String passwordCheck) {
		this.passwordCheck = passwordCheck;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	public String getTelNumber() {
		return telNumber;
	}

	public void setTelNumber(String telNumber) {
		this.telNumber = telNumber;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getAddressDetail() {
		return addressDetail;
	}

	public void setAddressDetail(String addressDetail) {
		this.addressDetail = addressDetail;
	}

	public boolean isAgreedPersonal() {
		return agreedPersonal;
	}

	public void setAgreedPersonal(boolean agreedPersonal) {
		this.agreedPersonal = agreedPersonal;
	}
	
	public boolean valid() {
		if(email == null || password == null || passwordCheck == null ||
				nickname == null || telNumber == null || address == null ||
				!agreedPersonal) {
			return false;
		}
		
		if(email.isBlank() || password.isBlank() || passwordCheck.isBlank() ||
				nickname.isBlank() || telNumber.isBlank() || address.isBlank()) {
			return false;
		}
		
		if(password.length() < 8) {
			return false;
		}
		
		if(!password.equals(passwordCheck)) {
			return false;
		}
	    
		boolean emailCheck = PatternValidator.isValideEmail(email);
	    if(!emailCheck) {
	    	return false;
	    }
	    
	    boolean telNumberCheck = PatternValidator.isValideTelNumber(telNumber);
	    if(!telNumberCheck) {
	    	return false;
	    }
	    
		return true;
	}
	
}

com.yhj.board.dto.response

  • ResponseEntity
package com.yhj.board.dto.response;

import com.yhj.board.common.ResponseMessage;

public class ResponseEntity<D> {
	private int status;
	private String message;
	private D data;
	
	public ResponseEntity(int status, String message, D data) {
		this.status = status;
		this.message = message;
		this.data = data;
	}

	@Override
	public String toString() {
		return "[status=" + status + ", message=" + message + ", data=" + data + "]";

	} 
	
	public static <D> ResponseEntity<D> ok() {
		return new ResponseEntity<D>(200, ResponseMessage.SUCCESS, null);
	}
	
	public static <D> ResponseEntity<D> ok(D data) {
		return new ResponseEntity<D>(200, ResponseMessage.SUCCESS, data);
	}
	
	public static <D> ResponseEntity<D> badRequest() {
		return new ResponseEntity<D>(400, ResponseMessage.NOT_VALID_VALUE, null);
	}
	
	public static <D> ResponseEntity<D> badRequest(String message) {
		return new ResponseEntity<D>(400, message, null);
	}
	
	public static <D> ResponseEntity<D> unauthorized() {
		return new ResponseEntity<D>(401, ResponseMessage.SIGN_IN_FAILED, null);
	}
	
	public static <D> ResponseEntity<D> internalServerError(String message) {
		return new ResponseEntity<D>(500, message, null);
	}
	
}
  • SignInResponseDto
package com.yhj.board.dto.response;

import com.yhj.board.entity.User;

public class SignInResponseDto {

	private String email;
	private String nickname;
	private String profileImage;
	
	public SignInResponseDto (User user) {
		this.email = user.getEmail();
		this.nickname = user.getNickname();
		this.profileImage = user.getProfileImage();
	}

	@Override
	public String toString() {
		return "[email=" + email + ", nickname=" + nickname + ", profileImage=" + profileImage + "]";
	}
}
  • SignUpResponseDto
package com.yhj.board.dto.response;

public class SignUpResponseDto {
	
}

com.yhj.board.entity

  • Board
package com.yhj.board.entity;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.yhj.board.common.BoardIndex;

// 게시물 번호 / 제목 / 내용 / 작성일 / 
// [작성자 이메일] / 작성자 닉네임 / 작성자 프로필 사진 / 
// 댓글 / 좋아요 수 / 조회 수 / 게시물 이미지(여러개) 
public class Board {
	
//	private static int index = 1; // 도 가능
	
	private int boardNumber;
	private String title;
	private String contents;
	private String writeDatetime;
	private String writeEmail;
	private String writeNickname;
	private String writeProfileImage;
	private int viewCount;
	private List<String> imageList;
	private List<Liky> likeList;
	private List<Comment> commentList;
	
	
	public Board(String title, String contents, String writeEmail, String writeNickname, String writeProfileImage,
			List<String> imageList) { 
		
		Date now = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy. MM. dd. hh:mm:ss");
		
		this.boardNumber = BoardIndex.index++;
		this.title = title;
		this.contents = contents;
		this.writeDatetime = simpleDateFormat.format(now);
		this.writeEmail = writeEmail;
		this.writeNickname = writeNickname;
		this.writeProfileImage = writeProfileImage;
		this.viewCount = 0;
		this.imageList = imageList;
		this.likeList = new ArrayList<Liky>();
		this.commentList = new ArrayList<Comment>();
	}


	public String getTitle() {
		return title;
	}


	public void setTitle(String title) {
		this.title = title;
	}


	public String getContents() {
		return contents;
	}


	public void setContents(String contents) {
		this.contents = contents;
	}


	public String getWriteNickname() {
		return writeNickname;
	}


	public void setWriteNickname(String writeNickname) {
		this.writeNickname = writeNickname;
	}


	public String getWriteProfileImage() {
		return writeProfileImage;
	}


	public void setWriteProfileImage(String writeProfileImage) {
		this.writeProfileImage = writeProfileImage;
	}


	public int getViewCount() {
		return viewCount;
	}


	public void setViewCount(int viewCount) {
		this.viewCount = viewCount;
	}


	public int getBoardNumber() {
		return boardNumber;
	}


	public String getWriteDatetime() {
		return writeDatetime;
	}


	public String getWriteEmail() {
		return writeEmail;
	}


	public List<String> getImageList() {
		return imageList;
	}


	public List<Liky> getLikeList() {
		return likeList;
	}


	public List<Comment> getCommentList() {
		return commentList;
	}
	
	
	
	
}
  • Comment
package com.yhj.board.entity;

//댓글 작성자의 프로필 사진 / 댓글 작성자의 닉네임 / 댓글 작성 시간 / 댓글 내용 
public class Comment {

	private String writerProfileImage;
	private String writerNickname;
	private String writerDatetime;
	private String contents;
	
	public Comment(String writerProfileImage, String writerNickname, String writerDatetime, String contents) {
		this.writerProfileImage = writerProfileImage;
		this.writerNickname = writerNickname;
		this.writerDatetime = writerDatetime;
		this.contents = contents;
	}

	public String getWriterProfileImage() {
		return writerProfileImage;
	}

	public void setWriterProfileImage(String writerProfileImage) {
		this.writerProfileImage = writerProfileImage;
	}

	public String getWriterNickname() {
		return writerNickname;
	}

	public void setWriterNickname(String writerNickname) {
		this.writerNickname = writerNickname;
	}

	public String getWriterDatetime() {
		return writerDatetime;
	}

	public String getContents() {
		return contents;
	}
	
	
	
}
  • Liky
package com.yhj.board.entity;

//좋아요한 사용자의 프로필 사진 / [좋아요한 사용자의 이메일] / 좋아요한 사용자의 닉네임 
public class Liky {

	private String userProfileImage;
	private String userEmail;
	private String userNickname;
	
	public Liky(String userProfileImage, String userEmail, String userNickname) {
		this.userProfileImage = userProfileImage;
		this.userEmail = userEmail;
		this.userNickname = userNickname;
	}

	public String getUserProfileImage() {
		return userProfileImage;
	}

	public void setUserProfileImage(String userProfileImage) {
		this.userProfileImage = userProfileImage;
	}

	public String getUserNickname() {
		return userNickname;
	}

	public void setUserNickname(String userNickname) {
		this.userNickname = userNickname;
	}

	public String getUserEmail() {
		return userEmail;
	}
	
}
  • SearchWord
package com.yhj.board.entity;

// 검색어 / 이전 검색어 / 다음 검색어
public class SearchWord {
	
	private String word;
	private String preWord;
	private String nextWord;
	
	
	public SearchWord(String word, String preWord, String nextWord) {
		this.word = word;
		this.preWord = preWord;
		this.nextWord = nextWord;
	}

	
	public String getWord() {
		return word;
	}


	public String getPreWord() {
		return preWord;
	}


	public String getNextWord() {
		return nextWord;
	}
	
}
  • User
package com.yhj.board.entity;

import com.yhj.board.dto.request.SignUpRequestDto;

//이메일 / 비밀번호 / 닉네임 / 휴대전화번호 / 주소 / 상세주소 / 개인정보동의 여부 / 프로필 사진

public class User {

	private String email;
	private String password;
	private String nickname;
	private String telNumber;
	private String address;
	private String addressDetail;
	private boolean agreedPersonal;
	private String profileImage;
	
	public User(String email, String password, String nickname, String telNumber, String address, String addressDetail,
			boolean agreedPersonal) {
		this.email = email;
		this.password = password;
		this.nickname = nickname;
		this.telNumber = telNumber;
		this.address = address;
		this.addressDetail = addressDetail;
		this.agreedPersonal = agreedPersonal;
	}
	
	public User(SignUpRequestDto dto) {
		this.email = dto.getEmail();
		this.password = dto.getPassword();
		this.nickname = dto.getNickname();
		this.telNumber = dto.getTelNumber();
		this.address = dto.getAddress();
		this.addressDetail = dto.getAddressDetail();
		this.agreedPersonal = dto.isAgreedPersonal();
		this.profileImage = null;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	public String getProfileImage() {
		return profileImage;
	}

	public void setProfileImage(String profileImage) {
		this.profileImage = profileImage;
	}

	public String getEmail() {
		return email;
	}

	public String getPassword() {
		return password;
	}

	public String getTelNumber() {
		return telNumber;
	}

	public String getAddress() {
		return address;
	}

	public String getAddressDetail() {
		return addressDetail;
	}

	public boolean isAgreedPersonal() {
		return agreedPersonal;
	}
	
	public boolean isCreateValid() {
		if(email == null ||password == null || nickname == null || 
				telNumber == null || address == null) {
			return false;
		}
		
		if(email.isBlank() || password.isBlank() || nickname.isBlank() || 
				telNumber.isBlank() || address.isBlank() || !agreedPersonal) {
			return false;
		}
		return true;
	}
	
}

com.yhj.board.repository

  • BoardRepository
package com.yhj.board.repository;

import java.util.ArrayList;
import java.util.List;

import com.yhj.board.entity.Board;

public interface BoardRepository extends Repository<Board, Integer> {
	
	// 게시물 정보를 저장할 Board Entity List
	public static final List<Board> BOARDS = new ArrayList<Board>();

	
}
  • Repository
package com.yhj.board.repository;

public interface Repository<E, K> {
	
	// 데이터 생성 (저장) : CREATE
	boolean create(E entity);
	
	// 데이터 읽기 (검색) : READ
	E read(K key);
	
	// 데이터 수정 (수정) : UPDATE
	boolean update(E entity);
	
	// 데이터 삭제 (삭제) : DELETE
	boolean delete(K key);
	
}
  • UserRepository
package com.yhj.board.repository;

import java.util.ArrayList;
import java.util.List;

import com.yhj.board.entity.User;

public interface UserRepository extends Repository<User, String> {
	
	// 유저 정보를 저장할 User Entity  List
	public static final List<User> USERS = new ArrayList<User>();
//	USERS = new ArrayList<User>(); 주소가 바뀌기 때문에 이렇게 사용할 수 없음.
	
	public abstract boolean existsByEmail(String email);
	public abstract boolean existsByTelNumber(String telNumber);
	public abstract boolean existsByNickname(String nickname);
	
}

com.yhj.board.repository.implement

  • UserRepositoryImplement
package com.yhj.board.repository.implement;

import com.yhj.board.entity.User;
import com.yhj.board.repository.UserRepository;

public class UserRepositoryImplement implements UserRepository {

	@Override
	public boolean create(User entity) {
		// entity가 null 인지
		if(entity == null) return false;
		// 필수 값이 모두 입력되었는지
		if(!entity.isCreateValid()) return false;
		
		USERS.add(entity);
		
		return true;
	}

	@Override
	public User read(String key) {
		User result = null;
		
		if(key == null) return result;
		
		for(User user: USERS) {
			String email = user.getEmail();
			
			if(email.equals(key)) {
				result = user;
				break;
			}
		}
		
		return result;
	}

	@Override
	public boolean update(User entity) {
		if(entity == null) return false;
		
		String email = entity.getEmail();
		if(email == null) return false;
		
		for(int index = 0; index < USERS.size(); index++) {
			User user = USERS.get(index);
			String findEmail = user.getEmail();
			
			if(email.equals(findEmail)) {
				USERS.set(index, entity);
				break;
			}
		}
		
		return true;
	}

	@Override
	public boolean delete(String key) {
		if(key == null) return false;
		
		for(int index = 0; index < USERS.size(); index++) {
			User user = USERS.get(index);
			String email = user.getEmail();
			
			if(key.equals(email)) {
				USERS.remove(index);
				break;
			}
		}
		
		return true;
	}

	@Override
	public boolean existsByEmail(String email) {
		boolean result = false;
		
		for(User user : USERS) {
			if(user.getEmail().equals(email)) {
				result = true;
				break;
			}
		}
		
		return result;
	}

	@Override
	public boolean existsByTelNumber(String telNumber) {
		boolean result = false;
		
		for(User user : USERS) {
			if(user.getEmail().equals(telNumber)) {
				result = true;
				break;
			}
		}
		
		return result;
	}

	@Override
	public boolean existsByNickname(String nickname) {
		boolean result = false;
		
		for(User user : USERS) {
			if(user.getEmail().equals(nickname)) {
				result = true;
				break;
			}
		}
		
		return result;
	}

}

com.yhj.board.service

  • UserService
package com.yhj.board.service;

import com.yhj.board.dto.request.SignInRequestDto;
import com.yhj.board.dto.request.SignUpRequestDto;
import com.yhj.board.dto.response.ResponseEntity;
import com.yhj.board.dto.response.SignInResponseDto;
import com.yhj.board.dto.response.SignUpResponseDto;

public interface UserService {

	ResponseEntity<SignUpResponseDto> signUp(SignUpRequestDto dto);
	ResponseEntity<SignInResponseDto> signIn(SignInRequestDto dto);
	
//	Map<?, ?> signUp(SignUpRequestDto dto);
	// 편하지만 나중에 안 좋음. 유지보수, 사용하는 사람은 상당히 불편하다.
	
}

com.yhj.board.service.implement

  • UserServiceImplement
package com.yhj.board.service.implement;

import com.yhj.board.common.ResponseMessage;
import com.yhj.board.dto.request.SignInRequestDto;
import com.yhj.board.dto.request.SignUpRequestDto;
import com.yhj.board.dto.response.ResponseEntity;
import com.yhj.board.dto.response.SignInResponseDto;
import com.yhj.board.dto.response.SignUpResponseDto;
import com.yhj.board.entity.User;
import com.yhj.board.repository.UserRepository;
import com.yhj.board.repository.implement.UserRepositoryImplement;
import com.yhj.board.service.UserService; 

public class UserServiceImplement implements UserService {
	
	// UserRepository에 의존하게 되어버림.
//	private final UserRepository userRepository = new UserRepositoryImplement();
	
	// 변수를 외부에서 받아오는 일반적인 방법.
	private final UserRepository userRepository;
	
	public UserServiceImplement(UserRepository userRepository) {
		this.userRepository = userRepository;
	}
	
	@Override
	public ResponseEntity<SignUpResponseDto> signUp(SignUpRequestDto dto) {
		
		String eamil = dto.getEmail();
		String telNumber = dto.getTelNumber();
		String nickname = dto.getNickname();
		
		// 이메일 중복 확인
		boolean hasEmail = userRepository.existsByEmail(eamil);
		if(hasEmail) return ResponseEntity.badRequest(ResponseMessage.EXISTED_EMAIL);
		
		// 전화번호 중복 확인
		boolean hasTelNumber = userRepository.existsByTelNumber(telNumber);
		if(hasTelNumber) return ResponseEntity.badRequest(ResponseMessage.EXISTED_TEL_NUMBER);
		
		// 닉네임 중복 확인
		boolean hasNickname = userRepository.existsByNickname(nickname);
		if(hasNickname) return ResponseEntity.badRequest(ResponseMessage.EXISTED_NICKNAME);
		
		// Entity 생성
		User user = new User(dto);
		
		// Entity 저장
		boolean result = userRepository.create(user);
		if(!result) return ResponseEntity.internalServerError(ResponseMessage.DATABASE_ERROR);
		
		return ResponseEntity.ok();
	}

	@Override
	public ResponseEntity<SignInResponseDto> signIn(SignInRequestDto dto) {
		
		String email = dto.getEmail();
		String password = dto.getPassword();
		
		// 이메일로 유저정보 찾기
		User user = userRepository.read(email);
		if(user == null) return ResponseEntity.unauthorized();
		
		// 입력한 비밀번호가 저장된 비밀번호와 같은지 비교
		if(!password.equals(user.getPassword())) return ResponseEntity.unauthorized();
		
		SignInResponseDto data = new SignInResponseDto(user);
		return ResponseEntity.ok(data);
	}

}

0개의 댓글