본문 바로가기
Spring boot 프로젝트 기록/1. 백엔드 개발

회원정보 찾기

by 으노으뇨 2021. 12. 10.
728x90
반응형
SMALL

스프링부트를 자습하면서 궁금한게 생겼었습니다!!

바로

간단한 정보로 기존에 저장되어있는 정보를 가지고 올순 없을까?

물론 가능합니다.!!

그러나 이걸 책이나 강의없이 구현할 수 있느냐, 얼마나 고민을 할수있느냐에 따라

내 기술이 되거나, 복붙러가 되거나 갈라진다고 생각이들었습니다..ㅠㅠㅠ

우선 계획을 세웠습니다.

  • 이메일과 유저이름(패스워드의 경우 반대로)으로 회원정보를 몽땅 가져오자
  • SQL(리파지토리 단계)은 찾는다, 아이디와 유저이름을 통해
  • 겟방식으로? 포스트방식으로? : 포스트방식으로 호출
  • 입력값들을 UserDTO로 저장해서 처리된것도 UserDTO에 셋팅해서

간단하게 세웠습니다.

package com.unoSpringBoot.study.persistence;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.unoSpringBoot.study.model.UserEntity;

@Repository
public interface UserRepository extends JpaRepository<UserEntity, String> {
	UserEntity findByEmail(String email);

	Boolean existsByEmail(String email);

	UserEntity findByEmailAndPassword(String email, String password);

	UserEntity findByEmailAndUsername(String email, String password);
	// 	  ^----------------------^ <-- 새로추가됨
//	UserEntity changeUserInfo(String password);
//	boolean checkUserPassword(String password);
}

하단에 새로 findByEmailAndUsername으로 지었습니다.

이건 

find = Select 

From 절은 UserEntity라는 테이블(회원정보가 있는 테이블)

By Email And Username = where절

이렇게 되어있답니다.!! 한동안 에러가나서 보았더니 

여기를 제마음대로 써서 에러가 났었답니다 ㅠㅠㅠ

물론 복잡한 쿼리는 myBatis가 편합니다... 50줄60줄 넘는 쿼리문을

이렇게 쓰면 엄청 복잡해질게뻔하거든요...

그래서 전 매퍼를 사랑..

우선 저렇게 작성했고 저 쿼리를 사용할 서비스단을 만듭니다.

기존 유저와 관계된 쿼리들로 데이터를 정제하고 추출 및 관리하는 클래스인 

UserService 클래스에 매서드를 만들어줍니다.

	public UserEntity findByEmailAndUsername(final String email, final String username) {
		return userRepository.findByEmailAndUsername(email, username);
	}

그리고 이 매서드를 컨트롤하는 클래스인

컨트롤 오브젝트 , FindUserInfoCO를 만들고 내용을 넣어줍니다.

앞어 설계한것처럼 UserDTO로 정보들을 받아 UserDTO로 값을 리턴하는 식으로 계획했습니다.

@Service
public class FindUserInfoCO {
	@Autowired
	private UserService service;

	public ResponseEntity<?> findUserInfo(UserDTO userDTO) {
		try {
			UserEntity userEntity = service.findByEmailAndUsername(userDTO.getEmail(), userDTO.getUsername());
			final UserDTO responseUserDTO = UserDTO.builder().username(userEntity.getUsername())
					.email(userEntity.getEmail()).auth(userEntity.getAuth()).password(userEntity.getPassword()).build();
			return ResponseEntity.ok().body(responseUserDTO);
		} catch (Exception e) {
			// 사용자 정보는 항상 하나이므로 리스트로 만들어야하는 ResponseDTO를 사용하지 않고 그냥 UserDTO리턴하도록 함
			ResponseDTO<Object> responseDTO = ResponseDTO.builder().error(e.getMessage()).build();
			return ResponseEntity.badRequest().body(responseDTO);
		}
	}
}

유저 엔티티라는 테이블에 받아온 UserDTO의 이메일과 유저이름을 쿼리문조건으로 넣어줍니다! (매개변수로!)

그리고 그렇게 나온 결과값은 userEntity에 들어가게되곘죠!?

그리고 새로 리턴해줄 UserDTO를 responseUserDTO로 새로 생성해서 빌더매서드를 이용해서 넣어줍니다.

그리고 반환하고, 에러시 에러반환 이렇게 작성을 했습니다.

이제 최종적으로 Url과 서비스를 매핑해주는 SO 서비스 오브젝트를 작성해주면되겠습니다.

@Autowired
 findUserInfoCO;
@PostMapping("/find")
 ResponseEntity<?> changeUserInfo(@RequestBody UserDTO userDTO) {
return findUserInfoCO.findUserInfo(userDTO);
}

auth/find 를 포스트형식으로 호출되면 해당 서비스를 실행하게됩니다.

이제 작성이 완료되었으니 테스팅을 해보겠습니다!!

아직 로그인과 UI적인것은 구현은 되지않았지만 최대한 백엔드에서 기능들을

구현하고 UI에 신경쓰고싶어서 그렇게 되었습니다....


서버를 시작해주고, 새로 아이디를 생성해줍니다.

아이디와 비밀번호 유저이름 모두 입력해주었습니다.!

이때 권한을 제가 따로 추가했습니다. 나중에 권한에 따라 볼수있거나 

기능제한이라던가 관리라던가 등을 수행할수있는 Key가 될것이기 떄문입니다.

입력한 정보를 가진 계정이 생성되었습니다. 

이제 

localhost:8080/auth/find

를 통해 값을 잘가져오는지 확인해봅시닷!

값이 모두 잘나왔습니다. 토큰번호와 uu아이디는 나올필요가없기에 

널처리되어 나오는 것까지 마무리 되었습니다.

꾸준히 기능을 구현할때마다 업로드는 여기서 하겠습니다.

728x90
반응형
LIST

댓글