상세 컨텐츠

본문 제목

[WithParents] Family, Member DTO 정의 | UserService 생성

Project/WithParents

by yooputer 2022. 11. 9. 16:08

본문

이번 포스팅에서는 Family와 Member의 DTO를 생성하고

서비스에 Family와 Member를 생성하는 메서드를 구현해볼 것이다.


DTO란?

http 기반의 요청이 들어오면 컨트롤러는 서비스에 구현된 메서드를 사용해 해당 요청을 처리한다.

서비스는 레파지토리를 통해 데이터베이스에 접근한다.

 

이때 레파지토리에서 사용되는 객체는 DAO(Data Access Object)로 데이터베이스에 접근하기위한 객체인데

DAO를 컨트롤러와 서비스에서 사용하기에는 불필요한 정보들이 포함된 경우가 많다. 

 

그래서 컨트롤러와 서비스 계층에서 사용하기 위해 필요한 정보만 포함하는 DTO(Data Transfer Object)를 만들어 사용한다.

예를 들어 Member는 데이터베이스에 저장된 모든 정보를 포함하지만 MemberDTO는 서비스계층에서 필요한 일부 정보들만 포함한다. 


Member, Family DTO 정의

dto 패키지를 생성하고 dto 패키지 아래에 MemberDTO 클래스와 FamilyDTO 클래스를 생성한다.

 

MemberDTO를 아래과 같이 작성한다

@Getter
@Setter
@AllArgsConstructor
public class MemberDTO {

    private Long id;
    private String username;
    private String nickname;
    private String authority;
    private Long family_id;

    public static MemberDTO entityToDTO(Member e){

        return new MemberDTO(
                e.getId(),
                e.getUsername(),
                e.getNickname(),
                e.getAuthority(),
                e.getFamily() == null ? null : e.getFamily().getId()
        );
    }

}

 

Member DAO와 비교하면 password가 제거되고 family 객체대신 family_id가 추가된 것을 확인할 수 있다. 

또한 엔티티를 DTO로 변환하는 스태틱 메서드를 구현하였다.

 

FamilyDTO를 아래와같이 작성한다

@Getter
@Setter
@AllArgsConstructor
public class FamilyDTO {
    
    private long id;
    private String password;
    private String creator_id;

}

 

FamilyDTO에는 id와 password, creater_id가 포함된다.

family 객체의 password는 모든 가족들이 공유하는 것이라 family를 조회할 때 같이 반환하도록 구현한다.


User 서비스 구현

유저와 관련된 메서드들을 구현한 UserService를 작성해보도록 하겠다

우선 service라는 패키지를 생성하고 service 패키지 아래에 UserService를 생성하고 아래와 같이 작성한다.

@Service 어노테이션은 해당 클래스를 빈 객체로 등록하고 서비스 레이어 컨트롤러라는 것을 명시한다

@RequiredArgsConstructor 어노테이션은 private final로 정의된 변수들처럼 꼭 초기화되어야하는 변수들을 자동으로 초기화해준다.

Service 클래스에서는 Repository를 사용해 데이터베이스에 접근한다.

 

테스트유저 생성 메서드 구현

UserService 클래스에 다음과 같이 테스트유저를 생성하는 메서드를 구현한다

@Transactional
public MemberDTO createTestMember(
        String username,
        String nickname,
        String password,
        String authority
){
    return MemberDTO.entityToDTO(
            memberRepo.save(new Member(
                    null,
                    username,
                    password,
                    nickname,
                    authority,
                    null
            ))
    );
}

 

 

family 생성 메서드 구현

UserService 클래스에 아래과 같이 family를 생성하는 메서드를 구현한다

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

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

        return FamilyDTO.entityToDTO(
                familyRepo.save(new Family(
                        null,
                        password,
                        null,
                        creator
                ))
        );
    }

다음 포스팅에서는 컨트롤러를 생성하고 이번 포스팅에서 만든 메서드를 이용해 Member와 Family를 생성하는 api를 구현해보도록 하겠다.

관련글 더보기