JHipster는 롬복을 사용하지 않습니다. 왜요?
JHipster generator을 처음 실행한 후 스프링 부트로 구현된 백엔드가 Lombok을 사용하지 않는다는 것을 깨달았습니다. 그래서 JHipster를 사용하는 것이 최선의 방법이 아니라는 것을 깨닫고 lombok을 사용하도록 생성된 코드를 사용자 지정하기로 결정했습니다.
JHipster 커스터마이징
When I realized how awesome JHipster was 생성된 코드를 이전에 수동으로 입력했던 것과 같이 변경해야 한다고 생각했습니다. 그래서 다음과 같은 사용자 지정 주석을 사용하여 나만의 주석blueprint을 만들 수 있는 기회를 보았습니다.
서버 측 코드를 사용자 정의하는 청사진 소스를 열었습니다.
다음은 내 청사진을 사용하는 jdl 파일 예제입니다.
@lombok
@schema(MyProject)
@noCodeComment
entity RenanClasse (RenanOk) {
@generatedValue(identity)
id Long
@column(ds_name)
name String
@newFieldTypeImport(java_time_LocalDateTime)
@newFieldType(LocalDateTime)
birthday ZonedDateTime
}
// Use Data Transfer Objects (DTO)
dto * with mapstruct
// Service layer
service all with serviceClass
JHipster는 Lombok을 사용하지 않습니다.
롬복을 사용하지 않는 이유를 나열한 issue at jhipster generated project을 찾았습니다. 그 중 일부를 인용하겠습니다.
On one project, a new version of the Lombok plugin caused the IDE to crash (I think this was Intellij). So nobody could work anymore.
On another project, Lombok made the CI server crash (and would have probably caused the production server to crash), as it triggered a bug in the JVM
On a third project, we achieved 30% performance increase by recoding the equals/hashcode from Lombok
Then, for JHipster, the story is also that we can't ask people to install a plugin on their IDE:
1st goal is to have a smooth experience: you generate the app and it works in your IDE, by default
2nd goal is that you can use whatever IDE you want. And some people have very exotic things, for example I just tried https://codenvy.com/ -> no plugin for this one, of course
엔티티 구현
다음 예에서 JHipster가 수동으로 설정 및 가져오기를 구현하는 것을 볼 수 있습니다. 그 외에도 jhipster에서 유창한 세터 구현에 대해 논의하는 JHipster generator source code 및 this issue 에서 배운 대로 유창한 메서드라고 하는 것을 구현하는 것을 볼 수 있습니다.
@Entity
@Table(name = "nap")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Nap implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
@Column(name = "id")
private Long id;
@Column(name = "start")
private ZonedDateTime start;
@Column(name = "jhi_end")
private ZonedDateTime end;
@Enumerated(EnumType.STRING)
@Column(name = "place")
private Place place;
@ManyToOne
private BabyProfile babyProfile;
@ManyToOne
private Humor humor;
// jhipster-needle-entity-add-field - JHipster will add fields here
public Long getId() {
return this.id;
}
public Nap id(Long id) {
this.setId(id);
return this;
}
public void setId(Long id) {
this.id = id;
}
public ZonedDateTime getStart() {
return this.start;
}
public Nap start(ZonedDateTime start) {
this.setStart(start);
return this;
}
public void setStart(ZonedDateTime start) {
this.start = start;
}
public ZonedDateTime getEnd() {
return this.end;
}
public Nap end(ZonedDateTime end) {
this.setEnd(end);
return this;
}
public void setEnd(ZonedDateTime end) {
this.end = end;
}
public Place getPlace() {
return this.place;
}
public Nap place(Place place) {
this.setPlace(place);
return this;
}
public void setPlace(Place place) {
this.place = place;
}
public BabyProfile getBabyProfile() {
return this.babyProfile;
}
public void setBabyProfile(BabyProfile babyProfile) {
this.babyProfile = babyProfile;
}
public Nap babyProfile(BabyProfile babyProfile) {
this.setBabyProfile(babyProfile);
return this;
}
public Humor getHumor() {
return this.humor;
}
public void setHumor(Humor humor) {
this.humor = humor;
}
public Nap humor(Humor humor) {
this.setHumor(humor);
return this;
}
// jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Nap)) {
return false;
}
return id != null && id.equals(((Nap) o).id);
}
@Override
public int hashCode() {
// see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/
return getClass().hashCode();
}
// prettier-ignore
@Override
public String toString() {
return "Nap{" +
"id=" + getId() +
", start='" + getStart() + "'" +
", end='" + getEnd() + "'" +
", place='" + getPlace() + "'" +
"}";
}
}
출처: Nap.java
따라서 빌더 패턴을 사용할 때처럼 이 개체를 만들 수 있지만 변경할 수는 없습니다.
Nap nap = new Nap().id(1l).start(ZonedDateTime.now()).end(ZonedDateTime.now().plusHours(1));
나는 이 구현을 즐겼고 내 코드를 덜 장황하게 유지하기에 충분했습니다.
이게 방법이야
JHipster 생성 코드를 사용자 정의하는 것을 포기했습니다.
나는 jhipster 생성 코드 패턴을 수락해야 한다는 것을 깨달았습니다. 모든 것을 사용자 지정하려고 하면 나만의 JHipster를 만들고 JHipster가 내 작업 흐름에 가져올 수 있는 생산성을 잃게 되기 때문입니다.
최신 jhipster 생성기 버전으로 청사진을 최신 상태로 유지하는 것은 쉬운 일이 아닙니다. 따라서 꼭 필요한 경우에만 청사진을 작성하는 것이 좋습니다.
Reference
이 문제에 관하여(JHipster는 롬복을 사용하지 않습니다. 왜요?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/renanfranca/jhipster-does-not-use-lombok-why-12o9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)