일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- AWS
- redis
- db
- java
- Git
- it
- Spring
- IntelliJ
- elasticsearch
- ReactJS
- ubuntu
- Gradle
- Spring Batch
- Spring Boot
- laravel
- springboot
- 맛집
- Oracle
- MySQL
- devops
- linux
- Web Server
- php
- JVM
- javascript
- Design Patterns
- 요리
- jsp
- tool
- jenkins
Archives
- Today
- Total
아무거나
[Lombok] Lombok 사전 본문
반응형
-
Intellij Lombok 사용 (Mac)
- Preference -> Plugins -> Browse Repositories 에서 Lombok Plugin 추가
- Prepference -> Build, Execution, Deployment -> Compiler -> Annotation Processors "Enable Annotation Processors" 체크
-
Lombok Annotations
- @Getter @Setter
- Getter / Setter Method 생성(모든 필드의 타입에 맞추어 생성)
- Class에 적용하면 static을 제외한 모든 필드에 적용
- AccessLevel 을 명시하지 않으면 public
- 종류: PUBLIC, PROTECTED, PACKAGE, PRIVATE, NONE
- 특정 필드만 적용에서 제외시킬때 NONE
- Example Code [Lombok 적용]
[Java 코드]public class UserProfile { private int userSeq; private String userName; private String email; public int getUserSeq() { return this.userSeq; } public String getUserName() { return this.userName; } public String getEmail() { return this.email; } public void setUserName(String userName) { this.userName = userName; } public void setEmail(String email) { this.email = email; } protected void setUserSeq(int userSeq) { this.userSeq = userSeq; } }
@Getter @Setter public class UserProfile { @Setter(AccessLevel.PROTECTED) private int userSeq; private String userName; private String email; }
- @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
- @NoArgsConstructor
- 파라미터가 없는 생성자를 만든다.
- 초기 값이 필요한 final 필드가 있을 경우, 컴파일 에러 -> @NoArgsConstructor(force=true) 를 사용
- Example Code [Lombok 적용]
[Java 코드]@NoArgsConstructor(force=true) public class UserProfile { private final int userSeq; @NonNull private String userName; private String email; }
public class UserProfile { private final int userSeq; @NonNull private String userName; private String email; public UserProfile() { this.userSeq = 0; this.userName = null; } }
- @RequiredArgsConstructor
- 초기화가 필요한 final 필드나 @NotNull 이 지정된 필드를 파라미터로 갖는 생성자를 만든다.
- Example Code [Lombok 적용]
[Java 코드]@RequiredArgsConstructor public class UserProfile { private final int userSeq; @NonNull private String userName; private String email; }
public class UserProfile { private final int userSeq; @NonNull private String userName; private String email; @java.beans.ConstructorProperties({"userSeq", "userName"}) public UserProfile(int userSeq, String userName) { this.userSeq = userSeq; this.userName = userName; } }
- StaticName Example Code (@RequiredArgsConstructor(staticName="bk")는 bk라는 이름의 static 팩토리 메서드 생성) [Lombok 적용]
[Java 코드]@RequiredArgsConstructor(staticName = "bk") public class TypeProfile<T> { private T type; }
public class TypeProfile<T> { @NonNull private T type; @java.beans.ConstructorProperties({"type"}) private TypeProfile(T type) { this.type = type; } public static <T> TypeProfile<T> bk(T type) { return new TypeProfile<T>(type); } }
- @AllArgsConstructor
- 모든 필드를 파라미터로 갖는 생성자를 만든다.
- Example Code [Lombok 적용]
[Java 코드]@AllArgsConstructor public class UserProfile { private final int userSeq; @NonNull private String userName; private String email; }
public class UserProfile { private final int userSeq; @NonNull private String userName; private String email; @java.beans.ConstructorProperties({"userSeq", "userName", "email"}) public UserProfile(int userSeq, String userName, String email) { this.userSeq = userSeq; this.userName = userName; this.email = email; } }
- @NoArgsConstructor
- @ToString
- toString() 메서드 생성
- static 필드가 아닌 모든 필드가 대상
- ClassName(FieldName1=값1, FieldName2=값2...)
- includeFieldNames = false 프린트 시 FieldName 제외 -> ClassName(값, 값...)
- 원하지 않는 필드 제외
- exclude="FieldName" or exclude={"FieldName1", "FieldName2"}
- Example Code [Lombok 적용]
[Java 코드]@ToString public class UserProfile { private int userSeq; private String userName; private String email; }
public class UserProfile { private int userSeq; private String userName; private String email; public String toString() { return "UserProfile(userSeq=" + this.userSeq + ", userName=" + this.userName + ", email=" + this.email + ")"; } }
- @EqualsAndHashCode
- hashCode와 equals를 생성
- @EqualsAndHashCode(of={"FieldName1", "FieldName2"}) 필요한 필드를 명시
- @EqualsAndHashCode(exclude={"FieldName1", "FieldName2"}) 제외할 필드를 명시
- Super Class가 존재하면 callSuper=true 명시
- Example Code [Lombok 적용]
[Java 코드]@EqualsAndHashCode(of={"userSeq", "userName"}) public class UserProfile { private int userSeq; private String userName; private String email; }
public class UserProfile { private int userSeq; private String userName; private String email; public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof UserProfile)) return false; final UserProfile other = (UserProfile) o; if (!other.canEqual((Object) this)) return false; if (this.userSeq != other.userSeq) return false; final Object this$userName = this.userName; final Object other$userName = other.userName; if (this$userName==null? other$userName != null: !this$userName.equals(other$userName)) return false; return true; } public int hashCode() { final int PRIME = 59; int result = 1; result = result * PRIME + this.userSeq; final Object $userName = this.userName; result = result * PRIME + ($userName == null ? 43 : $userName.hashCode()); return result; } protected boolean canEqual(Object other) { return other instanceof UserProfile; } }
- @Data
- @ToString, @EqualsAndHashCode, @RequiredArgsConstructor, 모든 필드 @Getter, final 이 아닌 필드에 @Setter 를 전부 한번에 생성
- @Cleanup
- 현재 변수의 스코프가 종료되기 전에 리소스가 clean up 되도록 보장해준다. -> close() 메소드를 알아서 호출하게 해줌
- Example Code [Lombok 적용]
[Java 코드]public class CleanupExample { public static void main(String[] args) throws IOException { @Cleanup InputStream in = new FileInputStream(args[0]); @Cleanup OutputStream out = new FileOutputStream(args[1]); byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; out.write(b, 0, r); } } }
public class CleanupExample { public static void main(String[] args) throws IOException { InputStream in = new FileInputStream(args[0]); try { OutputStream out = new FileOutputStream(args[1]); try { byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; out.write(b, 0, r); } } finally { if (out != null) { out.close(); } } } finally { if (in != null) { in.close(); } } } }
- Example Code [Lombok 적용]
- 현재 변수의 스코프가 종료되기 전에 리소스가 clean up 되도록 보장해준다. -> close() 메소드를 알아서 호출하게 해줌
- @Builder, @Builder.Default, @Singular
- @Builder
- 빌더 패턴을 적용한 객체 생성 메서드를 만든다.
- @Builder.Default
- @Builder시에 기본값이 null인데 @Builder.Default를 사용하면 객체 생성시 field 기본값 설정
- @Singular
- @Builder가 적용된 클래스의 필드가 Collection 타입 일 때, 해당 필드의 값을 추가하는 메서드 생성
- Example Code [빌더 호출 코드]
[Lombok 적용]// UserProfile(userSeq=0, userName=John Doe, email=user00@lombok.com, age=20, values=[One, Two]) UserProfile.builder() .userSeq(0) .userName("bkjeon") .email("bkjeon@lombok.com") .value("one") .value("two") .build();
[Java 코드]@Builder public class UserProfile { private final int userSeq; private String userName; private String email; @Builder.Default private int age = 20; @Singular private List<String> values; }
public class UserProfile { private final int userSeq; private String userName; private String email; @Builder.Default private int age = 20; private List<String> values; @java.beans.ConstructorProperties({"userSeq", "userName", "email", "age", "values"}) UserProfile(int userSeq, String userName, String email, int age, List<String> values) { this.userSeq = userSeq; this.userName = userName; this.email = email; this.age = age; this.values = values; } public static UserProfileBuilder builder() { return new UserProfileBuilder(); } public static class UserProfileBuilder { private int userSeq; private String userName; private String email; private int age; private ArrayList<String> values; UserProfileBuilder() { } public UserProfileBuilder userSeq(int userSeq) { this.userSeq = userSeq; return this; } public UserProfileBuilder userName(String userName) { this.userName = userName; return this; } public UserProfileBuilder email(String email) { this.email = email; return this; } public UserProfileBuilder age(int age) { this.age = age; return this; } public UserProfileBuilder value(String value) { if (this.values == null) this.values = new ArrayList<String>(); this.values.add(value); return this; } public UserProfileBuilder values(Collection<? extends String> values) { if (this.values == null) this.values = new ArrayList<String>(); this.values.addAll(values); return this; } public UserProfileBuilder clearValues() { if (this.values != null) this.values.clear(); return this; } public UserProfile build() { List<String> values; switch (this.values == null ? 0 : this.values.size()) { case 0: values = java.util.Collections.emptyList(); break; case 1: values = java.util.Collections.singletonList(this.values.get(0)); break; default: values = java.util.Collections.unmodifiableList(new ArrayList<String>(this.values)); } return new UserProfile(userSeq, userName, email, age, values); } public String toString() { return "UserProfile.UserProfileBuilder(userSeq=" + this.userSeq + ", userName=" + this.userName + ", email=" + this.email + ", age=" + this.age + ", values=" + this.values + ")"; } } }
- @Builder
- @Log / @Slf4j ...
- Log 객체들을 생성
- @Getter @Setter
참고: https://hyoj.github.io
반응형
'Java & Kotlin > Spring' 카테고리의 다른 글
[Spring boot] Jasypt를 활용한 Application Property 암호화 (0) | 2020.12.14 |
---|---|
[Lombok] Lombok 사용시 주의사항 (0) | 2020.12.01 |
Field Injection이 아닌 Constructor Injection 사용하자 (0) | 2020.11.24 |
[Spring Boot] 특정 패키지 내부의 원하는 클래스에 특정 메소드만 지정하여 Aspect 적용 (0) | 2020.06.06 |
[Spring Boot] Spring Boot + Mybatis + Mysql 을 활용한 계층형(=hierarchy) 게시판 구현 (0) | 2020.05.31 |
Comments