@MapStruct를 이용해 자동 mapper구현체 생성을 하여 코드를 작성한 후 postman으로 다음과 같은 값을 입력하려 하였으나 

전부 null값이 들어오며 500오류가 발생하였다.

 

 

콘솔창에 뜨는 에러메세지는 다음과 같다.

NULL not allowed for column

 

 

코드를 확인해보았다.

 

원인은 @MapStruct를 통해 자동 작성된 Mapper의 구현체가 제대로 작성되지 않았기 때문이었다.

 

 

 

원래는 mapper구현체에서 Dto객체가 들어오면 다음과 같이 get,set으로 값을 가져와 변환하고 Entity객체로 리턴해주어야 하나 get과 set메서드가 들어가는 부분이 전부 제대로 만들어지지 않았다.

@Component
public class CoffeeMapperImpl implements CoffeeMapper {

    @Override
    public Coffee coffeePostDtoToCoffee(CoffeePostDto coffeePostDto) {
        if ( coffeePostDto == null ) {
            return null;
        }

        Coffee coffee = new Coffee();
//요부분이 빠져있음!!
        coffee.setKorName( coffeePostDto.getKorName() );
        coffee.setEngName( coffeePostDto.getEngName() );
        coffee.setPrice( coffeePostDto.getPrice() );

        return coffee;
    }

    @Override
    public Coffee coffeePatchDtoToCoffee(CoffeePatchDto coffeePatchDto) {
        if ( coffeePatchDto == null ) {
            return null;
        }

        Coffee coffee = new Coffee();
//요부분이 빠져있음!!
        coffee.setCoffeeId( coffeePatchDto.getCoffeeId() );
        coffee.setKorName( coffeePatchDto.getKorName() );
        coffee.setEngName( coffeePatchDto.getEngName() );
        coffee.setPrice( coffeePatchDto.getPrice() );

        return coffee;
    }

    @Override
    public CoffeeResponseDto coffeeToCoffeeResponseDto(Coffee coffee) {
        if ( coffee == null ) {
            return null;
        }

        CoffeeResponseDto coffeeResponseDto = new CoffeeResponseDto();

        return coffeeResponseDto;
    }

    @Override
    public List<CoffeeResponseDto> coffeesToCoffeeResponseDtos(List<Coffee> coffees) {
        if ( coffees == null ) {
            return null;
        }

        List<CoffeeResponseDto> list = new ArrayList<CoffeeResponseDto>( coffees.size() );
        for ( Coffee coffee : coffees ) {
            list.add( coffeeToCoffeeResponseDto( coffee ) );
        }

        return list;
    }
}

아마 내가 작성한 코드를 자동으로 읽어와 mapper구현체를 만들 때 무언가를 못읽었거나, 잘못 읽어와 이런 오류가 생기는 것 같다. 역시 컴퓨터의 기능을 너무 믿으면 안된다... :(

 

시간나는대로 MapStruct로 구현체를 생성하는 원리와 과정에 대해 더 깊게 알아봐야겠다

그래야 오류가 난 정확한 원인을 파악 할 수 있을 것 같다.

 

 

따라서

 

@Getter와 @Setter 애너테이션이 들어간 모든 부분을 찾아 지워주고

 

애너테이션 대신 직접 코드로 Getter ,Setter 메서드를 작성해 주었다.

 

@Getter @Setter가 들어간 코드의 일부

위의 코드를

 

 

 

다음과 같이 바꿔주었다

//@Getter @Setter 삭제
@AllArgsConstructor
@NoArgsConstructor
public class Member {
    @Id 
    private long memberId;

    private String email;
    
    private String name;

    private String phone;
    
//get,set메서드 직접 작성 (윈도우 단축키 : alt + insert)

    public long getMemberId() {
        return memberId;
    }

    public void setMemberId(long memberId) {
        this.memberId = memberId;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

}

이런식으로 모든 부분을 바꿔주었다

(@Getter @Setter가 들어간 부분이 꽤 많아서 꼼꼼한 작업이 필요했다. 자꾸 중간에 안바꾼 부분이 있어서 또 오류나고, 또 오류나고 했다..)

 

 

Rebuile 후 다시 Apllication을 작동시키고 

postman으로 요청을 보내보았다.

 

 

이제서야 getter setter를 잘 읽어와 구현체가 맞게 작성되었고

postman으로 post시 원하는 결괏값을 얻을 수 있었다.

 

 

회원정보 post 외 나머지 커피정보 작성, 주문 요청 등의 post도 똑같이 @Getter @Setter애너테이션 부분을 직접 작성하는 코드로 바꿔 주니 정상 수행하였다.

복사했습니다!