저번 포스팅에서 만든 메서드를 이용해 TestMember와 Family를 생성하는 api를 구현해보자
이제 HTTP POST Request로 Member와 Family를 생성할 수 있도록 구현할 것이다.
그 전에 Post request body로 받을 데이터를 정의하는 RequestDTO를 정의해야한다.
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에는 위에 있는 인자들이 포함되어야 한다.
request 패키지 아래에 CreateFamilyRequest클래스를 생성하고 아래와같이 작성한다.
@Getter
public class CreateFamilyRequest {
private String password;
private long creatorId;
}
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 되었다.
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의 주요 기능중 하나인 약알림 기능을 구현해보도록 하겠다.
[WithParents] Medication 엔티티, 레파지토리, MedicationDTO 생성 (1) | 2022.11.23 |
---|---|
[WithParents] 예외처리 | custom exception | RestControllerAdvice | ExceptionHandler (0) | 2022.11.16 |
[WithParents] Family, Member DTO 정의 | UserService 생성 (0) | 2022.11.09 |
[WithParents] family, member 엔티티 생성 | 레파지토리 생성 (3) | 2022.11.02 |
[WithParents] 간단한 springboot 프로젝트 생성 | mysql 연동 | 깃 연동 (0) | 2022.11.02 |