개발할 때 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 공유 변수를 떠올리기 때문인 듯…