[꼼꼼한 개발자] 꼼코더
34. [개발일지] - [피파 온라인 4 프로젝트] - 05. 유저 고유 식별자로 유저 정보 조회(개발자의 상상은 현실이 된다, 메소드 이름의 중요성) 본문
34. [개발일지] - [피파 온라인 4 프로젝트] - 05. 유저 고유 식별자로 유저 정보 조회(개발자의 상상은 현실이 된다, 메소드 이름의 중요성)
꼼코더 2023. 5. 9. 07:39👓 메서드 명이.. 겹치네?
우선 두 메소드(닉네임으로 검색, 고유 식별자로 검색) 코드 속 기능이
요청 URL을 제외하고 전부 동일하다.
따라서 기존 findByUserInfo() 메소드 명을 바꾸지 않으면
[findByUserInfo() > 닉네임으로 검색, findByUserInfo2() > 유저 고유 식별자로 검색]이라는 대참사가 나올 수 있다.
물론 나는 이런 상황을 예상하지 않아서 만든 메서드명이다.
Controller, Service 메서드 명을 아래와 같이 수정하고 개발을 시작한다.
// Controller 클래스
public ModelAndView getUserByNickname
public FifaUser getUserByAccessId
// Service
// '닉네임'으로 유저 정보 검색
public FifaUser findUserByNickname(String nickname)
// '유저 고유 식별자'로 유저 정보 검색
public FifaUser findUserByAccessId(String accessId)
🧑🏻💻 코드 작성(Service, Controller)
비교적 Service에 기능 추가는 기존과 거의 비슷하여 이름만 변경하고
요청 URL만 변경하면 되어 쉽게 진행됐다.
문제는 컨트롤러였다. 음.. 닉네임으로 요청하고 다시 '유저 고유 식별자'로 재요청해야 하는데..
'설마.. 메서드가 메서드를 요청할 수 있나?'
그리고 바로 검색 후 '가능'을 확인하고 희망을 얻었다
역시 '개발자의 상상은 현실이 되는 거 같다..'
그렇게 Controller에 코드를 수정했다.
아래 코드를 보면 알 듯이 메소드속 메소드 호출로 얻어온 객체를
테스트를 하고 싶어 두 가지 모델을 전달했다.
(닉네임으로 가져온 객체, 고유 식별자로 가져온 객체)
이제 결과물을 확인해 보자.
@RestController // 이 클래스가 REST 컨트롤러임을 표시
@RequestMapping("/{users}")// 모든 메소드가 "/users"라는 엔드포인트에 매핑
@RequiredArgsConstructor // final 선언 필드 생성자 생성
public class FifaUserController {
// FifaUserRepository 타입의 인스턴스 변수 선언
private final FifaUserServiceImpl fifaUserServiceImpl;
// '닉네임'으로 '유저 정보' 조회 후 Model타입 반환
@GetMapping("/{nickname}")
public ModelAndView getUserByNickname(@PathVariable("nickname") String nickname, Model model) {
// FifaUserRepository의 findUserByNickname 메소드를 호출하여 FifaUser 객체를 가져온다.
FifaUser nickNameUser = fifaUserServiceImpl.findUserByNickname(nickname);
// getUserByAccessId 메소드로 재요청하여 '유저 고유 식별자'로 얻을 수 있는 정보들을 모두 얻어온다.
FifaUser accessIdUser = getUserByAccessId(nickNameUser.getAccessId());
if (accessIdUser == null) { // '유저 고유 식별자'로 가져온 FifaUser 객체가 null일 경우(존재하지 않을 경우)
return new ModelAndView("error"); // error.html View를 반환
}
model.addAttribute("nickNameUser", nickNameUser); // Model 객체에 (닉네임으로 가져온) 유저 정보를 추가
model.addAttribute("accessIdUser", accessIdUser); // Model 객체에 (고유 식별자로 가져온) 유저 정보를 추가
return new ModelAndView("userinfo"); // userinfo.html View를 반환
}
// '유저 고유 식별자'로 요청하는 메소드
@GetMapping("/userinfo={accessId}")
public FifaUser getUserByAccessId(@PathVariable("accessId") String accessId) {
// FifaUserRepository의 findUserByAccessId 메소드를 호출하여 FifaUser 객체를 가져온다.
FifaUser accessIdUser = fifaUserServiceImpl.findUserByAccessId(accessId);
if (accessIdUser == null) { // '유저 고유 식별자'로 가져온 FifaUser 객체가 null일 경우(존재하지 않을 경우)
return null; // null 반환
}
return accessIdUser; // '유저 고유 식별자'로 가져온 FifaUser 객체 반환
}
👨🏻🏫 화면 코드 작성, 결과 (Html)
구단주 이름, 레벨은 -> 닉네임으로 가져온 객체(1번째 모델)
고유 아이디는 -> 고유 식별자로 가져온 객체(2번째 모델)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"> <!-- Thymeleaf 네임스페이스를 선언 -->
<head>
<title>유저정보</title>
</head>
<body>
<h1>유저정보</h1>
<p th:text="${nickNameUser.nickname} + ' 구단주님'"></p>
<p th:text="'레벨 : ' + ${nickNameUser.level}"></p>
<p th:text="'accessId : ' + ${accessIdUser.accessId}"></p>
</body>
</html>
여기서 중요 한 건 '고유 아이디'가 화면에 정상적으로 출력이 된다면 (메서드 속에서 메소드 부르기 성공)
accessId로 조회할 수 있는 모든 API 목록을 사용할 수 있다는 이야기가 된다!!
과연..(두구두구두구) 성공이다!!
[구단주, 레벨(1번 모델)], [accessId (2 모델 > 메서드에서 메소드 호출 결과)]
모두 정상 출력이 된다!!
이제 뭘 해야 할까?? accessId로 조회할 수 있는 나머지 API 목록들 다 구현할 거다 (다 죽었어!!)
(여기까지 나의 과거의 개발일지가 마무리 됐다 이제부터는 실시간으로 나의 개발 과정과 느낀 점을 올릴 예정이다!)