public interface UserProfile {
String getUsername();
String getProfileImageUrl();
}
// select username, profileImageUrl from user; // closed projection
전체 필드를 조회할 수 밖에 없어서 Open 프로젝션 이라고 함
@Value(SpEL)
을 사용해서 연산
SpEL(Spring Expression Language) 연산자
타입 | 연산자 |
---|---|
Arithmetic | +, -, *, /, %, ^, div, mod |
Relational | <, >, ==, !=, <=, >=, lt, gt, eq, ne, le, ge |
Logical | and, or, not, &&, |
Conditional | ?: |
Regex | matches |
// 연산자 사용 예시
public interface UserProfile {
@Value('#{target.profileImageUrl != null}')
Boolean hasProfileImage;
}
스프링 빈 메서드 호출도 가능
// 스프링 빈 메서드 호출 예시
// workersHolder 는 bean 으로 등록한 contextHolder
@Value("#{workersHolder.salaryByWorkers['George']}")
private Integer georgeSalary;
쿼리 최적화 불가
인터페이스 기반 Projection
Projection 을 Interface 처럼
public interface UserProfile {
String getUsername();
String getProfileImageUrl();
@Value("#{target.profileImageUrl != null}")
boolean hasProfileImage();
default String getUserInfo() {
return getUsername() + " " + (hasProfileImage() ?
getProfileImageUrl() : "");
}
}
클래스 기반 Projection
Projection 을 DTO 클래스 처럼
@Getter
@AllArgsConstructor
public class UserInfo {
private String username;
private String password;
public String getUserInfo() {
return username + " " + password;
}
}
다이나믹 Projection