상세 컨텐츠

본문 제목

[WithParents] UserController 생성 | member, family 생성 api 구현

Project/WithParents

by yooputer 2022. 11. 9. 18:36

본문

저번 포스팅에서 만든 메서드를 이용해 TestMember와 Family를 생성하는 api를 구현해보자


RequestDTO 정의

이제 HTTP POST Request로 Member와 Family를 생성할 수 있도록 구현할 것이다.

그 전에 Post request body로 받을 데이터를 정의하는 RequestDTO를 정의해야한다.

 

CreateTestMemberRequest 클래스 정의

dto 패키지 아래에 request 패키지를 생성하고 request 패키지 아래에 CreateTestMemberRequest 클래스를 생성하고 아래와 같이 작성한다.

@Getter
public class CreateTestMemberRequest {

    private String username;
    private String nickname;
    private String password;
    private String authority;

}

Test Member을 생성하기 위해 HTTP Request를 보낼 때 body에는 위에 있는 인자들이 포함되어야 한다.

 

CreateFamilyRequest 클래스 정의

request 패키지 아래에 CreateFamilyRequest클래스를 생성하고 아래와같이 작성한다.

@Getter
public class CreateFamilyRequest {

    private String password;
    private long creatorId;

}

UserController 구현

UserController에서 member와 family에 관련된 요청을 처리할 것이다.

 

우선 controller라는 패키지를 새로 생성하고

controller 패키지 아래에 UserController 클래스를 생성하고 아래과 같이 작성한다.

@RestController
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @PostMapping("/api/user/createTestMember")
    public MemberDTO createTestMember(
            @RequestBody CreateTestMemberRequest body
    ){
        return userService.createTestMember(
                body.getUsername(),
                body.getNickname(),
                body.getPassword(),
                body.getAuthority()
        );
    }

    @PostMapping("/api/user/createFamily")
    public FamilyDTO createFamily(
            @RequestBody CreateFamilyRequest body
    ){
        return userService.createFamily(
                body.getPassword(),
                body.getCreatorId()
        );
    }

}

@RestController는 객체(json 타입으로 변환됨), String과 같은 데이터를 반환하는 controller임을 명시한다.

@PostMapping(<url>)은 해당 url의 post 요청을 처리하는 메서드임을 명시한다.

 

요청 보내보기

인텔리제이의 HTTP 요청 기능을 사용해 HTTP 요청을 보내보도록 하겠다.

(아마 인텔리제이 얼티메이트 버전에서 가능한 것으로 알고있다)

 

메서드 옆에 저 부분을 누르면 

 

다음과 같이 request를 작성할 수 있는 창이 뜨고 우리가 호출하려는 api가 작성되어있음을 확인할 수 있다.

 

아래와 같이 Content-Type과 body를 작성하고 왼쪽의 실행버튼을 누르면 

POST http://localhost:8080/api/user/createTestMember
Content-Type: application/json

{
"username": "testuser1",
  "nickname": "테스트유저",
  "password": "password",
  "authority": "ROLE_CHILD"
}

 

새로운 멤버가 생성되고 memberDTO가 반환되는 것을 확인할 수 있다. 

 

방금 생성한 member_id로 createFamily 요청을 호출하면 family가 생성되고 생성된 family의 DTO가 반환되는 것을 확인할 수 있다.

 

테이블에도 잘 insert 되었다.


추가적인 작업

family를 생성후 family를 생성한 member의 family_id 수정

UserService에 아래와 같은 메서드를 구현하고

@Transactional
public Member setFamilyId(long memberId, long familyId){

    Member member = memberRepo.findById(memberId)
            .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 member_id입니다."));

    Family family = familyRepo.findById(familyId)
            .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 family_id입니다."));

    member.setFamily(family);

    return member;
}

@Transactional을 사용하면 엔티티를 수정해서 데이터베이스의 값을 변경할 수 있다.

 

UserService의 createFamily 메서드를 다음과 같이 수정한다.

기존에는 insert하고 바로 DTO로 변환 후 반환하였지만

수정 후에는 insert후 creator의 family_id를 바꾸고 DTO로 변환 후 반환한다.

@Transactional
public FamilyDTO createFamily(
        String password,
        long creatorId
){

    // creator_id가 유효한지 검증
    Member creator = memberRepo.findById(creatorId)
            .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 member_id입니다."));

    Family family = familyRepo.save(new Family(
                    null,
                    password,
                    null,
                    creator
    ));

    setFamilyId(creatorId, family.getId());

    return FamilyDTO.entityToDTO(family);
}

 

이제 member의 family_id가 올바르게 바뀐 것을 확인할 수 있다. 


다음 포스팅에서는 WithParents의 주요 기능중 하나인 약알림 기능을 구현해보도록 하겠다.

관련글 더보기