개발할 때 DTO를 관리하는 것이 어려웠다. 대부분 응답에 사용할 DTO 필드 수 ≥ 요청에 사용할 DTO 필드 수이기 때문에 응답용 DTO 하나만 있어도 될 것 같지만 @JsonProperty, @NotBlank처럼 특정 요청에만 필요한 어노테이션이 있기 때문에 분리가 필요했다.

최종적으로는 다음과 같이 중첩 클래스를 이용해 작성하게 되었다.

public class MovieDto {

	@Getter
	@Setter
	@NoArgsConstructor
	@ApiModel(value = "MovieDto-Post")
	public static class Post { // 등록 요청용 DTO
	
			...
	    @NotBlank
	    @Length(max = 100)
	    private String title;
	
	    @Valid
	    @NotNull
	    @Size(min = 1, max = 10)
	    private List<GenreDto> genres;
	    ...	
	}
	
  @Getter
  @Setter
  @ApiModel(value = "MovieDto-Response")
  public static class Response { // 응답용 DTO

      ...
      @JsonProperty("vote_count")
      private int voteCount;

      @JsonProperty("vote_average")
      private float voteAverage;

      private List<GenreDto> genres;
			...
  }
	...
}

각 요청에 필요한 어노테이션을 따로 사용할 수 있게 되었다.

유의할 점


중첩 이너 클래스를 알게 된 뒤로는 쭉 그렇게 작성하고 있는데 static 키워드를 붙여도 되는지 궁금증이 생겼다. static 키워드를 멤버에나 붙여봤지 클래스에는 안 붙여봤기 때문에…

우선은 static 키워드에 대해서 조금 생각해보자. static 키워드는 주로 공유 변수나 인스턴스를 생성하지 않고도 메서드를 호출하고 싶을 때 (ex. util 클래스) 사용된다.

다음 실행 결과는 어떻게 될까?

class Outer{
	static class Inner { }
}

// main
Outer.Inner instance = new Outer.Inner();
Outer.Inner instance2 = new Outer.Inner();
System.out.println(instance.equals(instance2)); // ?

같은 인스턴스처럼 보이지만 false이다. 싱글턴이나 클래스 레벨의 static 공유 변수를 떠올리기 때문인 듯…