@ToString(exclude = "password")
public class User {
private String id;
private String password;
}
다수의 필드를 가지는 복잡한 클래스의 경우, 생성자 대신에 빌더를 사용하는 경우가 만핟. 빌더 패턴을 직접 작성해보면 의외로 코딩량이 상당하다. 이 때, @Builer
어노테이션을 사용하면 자동으로 해당 클래스에 빌더를 추가해주기 때문에 매우 편리합니다.
@Builder
public class User {
private Long id;
private String username;
private String password;
@Singular
private List<Integer> scores;
}
컬렉션으로 된 필드에는 @Singular
어노테이션을 선언해주면 모든 원소를 한 번에 넘기지 않고 원소를 하나씩 추가 할 수 있습니다.
User user = User.builder()
.id(1L)
.username("abc")
.password("1234")
.score(70)
.socre(80)
.build();
// User(id=1, username=dale, password=1234, scores=[70, 80])
Use
@NoArgsConstructor
public class User{
@NonNull
private String id;
private String password;
}
Unuse
public class User{
private String id;
private String password;
public User(String id){
this.id = id
}
}
권장 사용법
@AllArgsConstructor
public class User {
private String id;
private String pwd;
}
User user = new User("userId", "userPwd");
이런식으로 초기 설정을 했다면
@AllArgsConstructor
public class User {
private String pwd;
private String id;
}
User user = new User("userId", "userPwd"); //pwd,id의 위치가 바꼈지만 입력 매게변수는 위치가 바뀌지 않았다.
권장 사용법
public static class User {
private String pwd;
private String id;
@Builder
public User(String pwd, String id) {
this.pwd = pwd;
this.id = id;
}
}
User user = User.builder().pwd("userPwd").id("userId").build();
권장 사용법
@Value
@Setter //ignore
public class User {
public String id;
public String password;
}
Setter를 선언해도 사용이 불가능하다.
권장 사용법
@Value 역시 @EqualsAndHashCode, @AllArgsConstructor를 포함한다.
@Getter, @ToString 만 사용하는 것을 권장한다.
클래스마다 일일이 로거를 생성해주는 여간 귀찮은 일이 아닙니다. 이 때, @Log
어노테이션을 사용하면 자동으로 log필드를 만들고, 해당 클래스의 이름으로 로거 객체를 생성하여 할당해줍니다. @Log
뿐만 아니라, @Slf4j
나@Log4j2
등 다양한 로깅 프레임워크에 대응하는 어노테이션을 제공하오니 참고바랍니다.
@Log
public class LogExample {
//자동 생성
public static void main(String... args) {
log.info("TEST");
}
}
@NonNull
어노테이션을 변수에 붙이면 자동으로null
체크를 해줍니다. 즉, 해당 변수가 null
로 넘어온 경우, NullPointerException
예외를 일으켜 줍니다.
@NonNull @Setter
private String id;
obj.setId(null); // NullPointerException 발생
IO 처리나 JDBC 코딩을 할 때, try-catch-finally
문의 finally
절을 통해서close()
메소드를 호출하는 게 여간 번거로운 일이 아니었는데, @Cleanup
어노테션을 사용하면 해당 자원이 자동으로 닫히는 것이 보장됩니다.
@Cleanup Connection con = DriverManager.getConnection(url, user, password);
Checked Exception 때문에 반드시 throws
나 try-catch
구문을 통해서 번거롭게 명시적으로 예외 처리를 해줘야할 때가 있습니다. 이럴 때, @SneakyThrows
어노테이션을 사용하면 명시적인 예외 처리를 생략할 수 있습니다. (호불호가 갈릴수있다.)
@SneakyThrows(IOException.class)
public void printLines() {
BufferedReader reader = new BufferedReader(...);
for (String line; (line = reader.readLine()) != null; ) {
System.out.println(line);
}
}
자바의 synchronized
키워드를 메소드에 선언하면 객체 레벨에서 락이 걸려서 여러가지 동기화 관련 문제들이 발생할 수 있습니다. 대신에 @Synchronized
어노테이션을 사용하면 가상의 필드 레벨에서 좀더 안전하게 락을 걸어줍니다.
@Synchronized
public void hello() {
System.out.println("world");
}
출처
https://www.daleseo.com/lombok-useful-annotations/
https://ksshlee.github.io/spring/java/lombok/#tostring