티스토리 뷰

728x90

예를 들어 회원가입을 할 때 유저는 핸드폰 번호를 입력하고 그 핸드폰 번호가 중복이 있는지 요청을 보내고

그에 따라서 검증을 거친 다음 유저에게 정보를 알려줘야 한다.

(물론 실무에서는 당연히 외부 API를 이용한 검증을 할 것이므로 핸드폰 번호를 이런 식으로 하진 않을 것이다)

 

이때 본인이 만든 핸드폰 번호는 Embeddable를 객체로 만들어두어 JPA에서 바로 접근하려고 하면 Embeddable은 객체이고 받아온 값은 데이터라 타입이 맞지 않는 문제가 생겼다.

 

User 객체에 속한 핸드폰 번호 객체.

@Embeddable
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString
public class PhoneNumber {

    @NotEmpty
    @Column(name = "first_phone_number", length = 10)
    private String first;

    @NotEmpty
    @Column(name = "middle_phone_number", length = 10)
    private String middle;

    @NotEmpty
    @Column(name = "last_phone_number", length = 10)
    private String last;

 

구글링에서 나온 결과가 여럿 있었는데 본인이 선택한 방법은 Native Query를 이용한 방법이다.

JPA에서 지원해주는 @Query는 컬럼이 아닌 객체의 필드명에 접근하게 하므로 Embeddable이라도 객체명과 필드명으로 접근하는 것이 핵심이다.

 

@Query("SELECT u.phoneNumber FROM User u WHERE u.phoneNumber.first = :first AND u.phoneNumber.middle = :middle AND u.phoneNumber.last = :last")
Optional<User> findByPhoneNumber(String first, String middle, String last);

 

문제를 해결한 핵심은 u.phoneNumber.first = :first의 형태이다.

즉 점을 찍어서 Embeddable에 접근할 수 있고 또 점을 찍어서 Embeddable 내의 필드값에 접근할 수 있는 것이다.

 

해당 파라미터에 맞춰 값만 잘 넣어주면 알아서 잘 매핑이 되어 확인시켜준다.

 

 


JSON으로 데이터를 보낼때 위의 경우와 같이 단 하나의 데이터만 주고받는 경우가 있다.

이럴때는 DTO 객체를 생성하기에는 비용이 아깝고 값이 하나만 있는 DTO는 유지보수성에 좋지 않다고 생각하기에 Map<String, String> 형태로 받는 것이 좋다고 생각했다.

 

@PostMapping("/phone/duplication-check")
public ResponseEntity<?> phoneDuplicationCheck(@RequestBody Map<String, String> phoneNumberMap) {

    String phoneNumber = phoneNumberMap.get("phoneNumber");
    phoneNumber = phoneNumber.trim().replace("-", "");
    meService.duplicationCheck(phoneNumber);

    return ResponseEntity.ok(null);
}

 

fetch()로 아래와 같은 형태로 보내주면 된다.

 

                let data = {
                    method: 'POST',
                    body: JSON.stringify({
                        phoneNumber,
                    }),
                    headers: {
                        'Content-Type': 'application/json',
                    }
                };
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함