[꼼꼼한 개발자] 꼼코더

34. [개발일지] - [피파 온라인 4 프로젝트] - 05. 유저 고유 식별자로 유저 정보 조회(개발자의 상상은 현실이 된다, 메소드 이름의 중요성) 본문

개발일지/피파 온라인 4 프로젝트

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 목록들 다 구현할 거다 (다 죽었어!!)

 

 

(여기까지 나의 과거의 개발일지가 마무리 됐다 이제부터는 실시간으로 나의 개발 과정과 느낀 점을 올릴 예정이다!)

 

 

 

 

 

 

 

Comments