자바 개발 신기 Lombok 사용 설명
Lombok 이 뭐야?
Lombok 은 자바 개발 플러그 인 으로 정 의 된 주 해 를 통 해 지루 하고 번 거 로 운 코드 를 간소화 할 수 있 으 며 주로 간단 한 자바 모델 대상(POJO)을 대상 으로 합 니 다.
장점 은 분명 하 다.대량의 중복 작업 을 절약 할 수 있다.특히 POJO 류 의 속성 이 증감 할 때 중복 수정 이 필요 한 Getter/setter,구조 기 방법,equals 방법 과 toString 방법 등 이다.
또한 Lombok 은 이러한 내용 에 대한 처 리 는 컴 파일 기간 이지 반사 체 제 를 통 해 이 루어 지 는 것 이 아니 라 시스템 의 성능 을 떨 어 뜨리 지 않 는 다 는 장점 이 있다.
다음은 구체 적 인 사용 을 살 펴 보 자.
Lombok 의 설치
Lombok 의 설 치 는 두 부분 으로 나 뉜 다.Idea 플러그 인의 설치 와 maven 의 pom 파일 가 져 오기.
첫 번 째 단 계 는 Idea 플러그 인 설정 에서 Lombok 이나 홈 페이지 를 검색 하여 로 컬 설 치 를 다운로드 합 니 다.
또한 플러그 인의 설명 에서 도 지원 하 는 주 해 를 볼 수 있 습 니 다.
두 번 째 단 계 는 pom 에서 의존 하 는 것 을 도입 합 니 다.현재 가장 가 는 버 전 은 1.18.10 입 니 다.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
Idea 를 통 해 Spring Boot 프로젝트 를 만 드 는 경우 프로젝트 를 만 들 때'Developer Tool'에서 Lombok 을 직접 선택 할 수 있 습 니 다.상기 두 단 계 를 완성 하면 코드 에서 이 신 구 를 사용 할 수 있 습 니 다.
Lombok 의 사용
@Data
@Data 에서 가장 자주 사용 하 는 주석 중 하나 입 니 다.주 해 는 클래스 에 있어 서 이러한 모든 속성 을 제공 하 는 getter/setter 방법 을 제공 하고 equals,canEqual,hashCode,toString 방법 도 제공 합 니 다.
이곳 의 제공 은 무슨 뜻 입 니까?개발 자 들 이 손 으로 쓰 지 않 고 Lombok 이 만들어 주 는 것 이다.
@Data 예 시 를 사용 하면 다음 과 같 습 니 다.가장 직관 적 인 것 은 getter/setter 방법 을 쓰 지 않 아 도 됩 니 다.
@Data
public class Demo {
private int id;
private String remark;
}
우 리 는 이 종류의 컴 파일 후 어떤 모습 인지 보 았 다.
public class Demo {
private int id;
private String remark;
public Demo() {
}
public int getId() {
return this.id;
}
public String getRemark() {
return this.remark;
}
public void setId(final int id) {
this.id = id;
}
public void setRemark(final String remark) {
this.remark = remark;
}
public boolean equals(final Object o) {
if (o == this) {
return true;
} else if (!(o instanceof Demo)) {
return false;
} else {
Demo other = (Demo)o;
if (!other.canEqual(this)) {
return false;
} else if (this.getId() != other.getId()) {
return false;
} else {
Object this$remark = this.getRemark();
Object other$remark = other.getRemark();
if (this$remark == null) {
if (other$remark != null) {
return false;
}
} else if (!this$remark.equals(other$remark)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(final Object other) {
return other instanceof Demo;
}
public int hashCode() {
int PRIME = true;
int result = 1;
int result = result * 59 this.getId();
Object $remark = this.getRemark();
result = result * 59 ($remark == null ? 43 : $remark.hashCode());
return result;
}
public String toString() {
return "Demo(id=" this.getId() ", remark=" this.getRemark() ")";
}
}
위의 역 컴 파일 코드 는 기본 적 인 구조 방법,속성 을 제공 하 는 getter/setter 방법,equals,canEqual,hashCode,toString 방법 을 볼 수 있 습 니 다.사용 하기에 편리 하지 않 습 니까?가장 관건 적 인 것 은 속성 을 추가 하거나 감소 할 때 속성 정 의 를 직접 삭제 하면 됩 니 다.효율 이 많이 향상 되 었 습 니까?
편폭 을 절약 하기 위해 서 뒤의 관련 주 해 는 역 컴 파일 효 과 를 보지 않 습 니 다.여러분 은 아이디어 로 컴 파일 된 후에 대응 하 는 class 파일 을 직접 열 면 볼 수 있 습 니 다.
@Setter
속성 에 작용 하여 이 속성 에 setter 방법 을 제공 합 니 다.역할 과 클래스 에 서 는 이러한 모든 속성 에 setter 방법 을 제공 하고 기본 구조 방법 을 제공 합 니 다.
public class Demo {
private int id;
@Setter
private String remark;
}
@Setter
public class Demo {
private int id;
private String remark;
}
@Getter기본적으로 같은@Setter 방법 을 사용 하지만 getter 방법 을 제공 합 니 다.더 이상 군말 하지 않 습 니 다.
@Log4j
클래스 에 사용 되 며,이 클래스 에 로그 라 는 로그 4j 로그 대상 을 제공 합 니 다.
@Log4j
public class Demo {
}
이 속성 은 일반적으로 Controller,Service 등 업무 처리 류 에 사용 된다.이 주석 과 같은 것 은@Log4j 2,말 그대로 Log4j 2 입 니 다.@AllArgsConstructor
클래스 에 작용 하여 이 클래스 에 모든 참 을 포함 하 는 구조 방법 을 제공 합 니 다.이때 기본 구조 방법 은 제공 되 지 않 습 니 다.
@AllArgsConstructor
public class Demo {
private int id;
private String remark;
}
효 과 는 다음 과 같 습 니 다:
public class Demo {
private int id;
private String remark;
public Demo(final int id, final String remark) {
this.id = id;
this.remark = remark;
}
}
@NoArgsConstructor유형 에 작용 하여 인삼 이 없 는 구조 방법 을 제공 하 다.@AllArgs Constructor 와 동시에 사용 할 수 있 습 니 다.이때 두 가지 구조 방법 이 생 성 됩 니 다.무 참 구조 방법 과 전 참 구조 방법 입 니 다.
@EqualsAndHashCode
클래스 에 작용 하여 equals,canEqual,hashCode 방법 을 생 성 합 니 다.구체 적 인 효 과 는 처음@Data 효 과 를 참조 합 니 다.
@NonNull
속성 에 작용 하여 이 매개 변수 에 대한 비 공 검 사 를 제공 합 니 다.매개 변수 가 비어 있 으 면 빈 포인터 이상 을 던 집 니 다.
사용 방법:
public class Demo {
@NonNull
private int id;
private String remark;
}
효 과 는 다음 과 같 습 니 다:
public class Demo {
@NonNull
private int id;
private String remark;
}
@RequiredArgsConstructor클래스 에 작용 하 며,클래스 에@NonNull 주석 이 있 거나 final 수식 이 있 는 모든 구성원 변 수 를 매개 변수 로 구조 방법 을 생 성 합 니 다.
@Cleanup
변수 에 작용 하여 이 변수 가 대표 하 는 자원 이 자동 으로 닫 히 는 것 을 보증 합 니 다.기본적으로 자원 을 호출 하 는 close()방법 입 니 다.이 자원 에 다른 닫 는 방법 이 있 으 면 사용 할 수 있 습 니 다.
@Cleanup(“methodName”) 。
public void jedisExample(String[] args) {
try {
@Cleanup Jedis jedis = redisService.getJedis();
} catch (Exception ex) {
logger.error(“Jedis :”,ex)
}
}
효 과 는:
public void jedisExample(String[] args) {
Jedis jedis= null;
try {
jedis = redisService.getJedis();
} catch (Exception e) {
logger.error(“Jedis :”,ex)
} finally {
if (jedis != null) {
try {
jedis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@ToString클래스 에 작용 하여 모든 인 자 를 포함 하 는 toString 방법 을 생 성 합 니 다.@Data 에서 toString 방법 을 보십시오.
@Value
클래스 에 작용 하면 모든 매개 변수의 구조 방법,getter 방법,equals,hashCode,toString 방법 을 생 성 합 니 다.@Data 에 비해 전 참 구조 방법 이 많 고 기본 구조 방법,setter 방법,canEqual 방법 이 적 습 니 다.
이 주 해 는 필드 에 final 수식 을 추가 합 니 다.개인 적 으로 제어 가 안 되 는 것 같 아서 사용 하 는 것 을 권장 하지 않 습 니 다.
@SneakyThrows
방법 에 있어 서 방법 내 코드 를 try-catch 처리 하 는 것 과 같 습 니 다.이상 catch 를 캡 처 할 때 Lombok.sneakyThrow(e)로 이상 을 던 지 는 것 과 같 습 니 다.@SneakyThrows(BizException.class)를 사용 하여 구체 적 인 이상 을 던 집 니 다.
@SneakyThrows
public int getValue(){
int a = 1;
int b = 0;
return a/b;
}
효 과 는 다음 과 같 습 니 다:
public int getValue() {
try {
int a = 1;
int b = 0;
return a / b;
} catch (Throwable var3) {
throw var3;
}
}
@Synchronized클래스 방법 이나 인 스 턴 스 방법 에 사용 되 며,효 과 는 synchronized 와 같 습 니 다.차이 점 은 잠 금 대상 이 다 릅 니 다.클래스 방법 과 인 스 턴 스 방법 에 대해 synchronized 키워드 의 잠 금 대상 은 각각 클래스 의 class 대상 과 this 대상 이 고@Synchronized 의 잠 금 대상 은 각각 개인 정적 final 대상 lock 과 개인 final 대상 lock 입 니 다.자물쇠 대상 도 지정 할 수 있 습 니 다.
public class FooExample {
private final Object readLock = new Object();
@Synchronized
public static void hello() {
System.out.println("world");
}
@Synchronized("readLock")
public void foo() {
System.out.println("bar");
}
}
효 과 는 다음 과 같다.
public class FooExample {
private static final Object $LOCK = new Object[0];
private final Object readLock = new Object();
public static void hello() {
synchronized($LOCK) {
System.out.println("world");
}
}
public void foo() {
synchronized(readLock) {
System.out.println("bar");
}
}
}
val실제 기록 형식 이 아 닌 부분 변수 성명 형식 으로 val 을 사용 합 니 다.이 동작 을 실행 할 때 초기 화 표현 식 에서 형식 을 추정 합 니 다.
public Map<String, String> getMap() {
val map = new HashMap<String, String>();
map.put("1", "a");
return map;
}
효 과 는 다음 과 같 습 니 다:
public Map<String, String> getMap() {
HashMap<String, String> map = new HashMap();
map.put("1", "a");
return map;
}
즉,부분 변수 에서 Lombok 은 구체 적 인 유형 을 추정 해 주지 만 부분 변수 에 만 사용 할 수 있다.@Builder
클래스 에 작용 합 니 다.만약 당신 이 Builder 의 흐름 식 조작 을 좋아한다 면@Builder 는 당신 이 좋아 하 는 주해 일 것 입 니 다.
사용 방법:
@Builder
public class Demo {
private int id;
private String remark;
}
효 과 는 다음 과 같 습 니 다:
public class Demo {
private int id;
private String remark;
Demo(final int id, final String remark) {
this.id = id;
this.remark = remark;
}
public static Demo.DemoBuilder builder() {
return new Demo.DemoBuilder();
}
public static class DemoBuilder {
private int id;
private String remark;
DemoBuilder() {
}
public Demo.DemoBuilder id(final int id) {
this.id = id;
return this;
}
public Demo.DemoBuilder remark(final String remark) {
this.remark = remark;
return this;
}
public Demo build() {
return new Demo(this.id, this.remark);
}
public String toString() {
return "Demo.DemoBuilder(id=" this.id ", remark=" this.remark ")";
}
}
}
우 리 는 이러한 내부 에서 Demo Builder 류 를 제공 하여 구체 적 인 흐름 식 작업 을 처리 하 는 것 을 볼 수 있다.전 삼 의 구조 방법 도 제공 했다.작은 매듭
마지막 으로 개인 적 인 견 해 를 말씀 드 리 겠 습 니 다.이 신 구 는 사용 하기 좋 지만 무조건 사용 하 는 것 을 권장 하지 않 습 니 다.프로그램의 효율 등 문 제 를 위해 직접 써 야 할 코드 는 직접 써 야 합 니 다.결국 맞 춤 형 만 이 현재 장면 에 가장 최적화 되 고 가장 부합된다.
자바 개발 신기 Lombok 사용 에 대한 자세 한 설명 은 여기까지 입 니 다.자바 Lombok 사용 에 관 한 더 많은 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.