JHipster는 롬복을 사용하지 않습니다. 왜요?

원래 게시일:

JHipster generator을 처음 실행한 후 스프링 부트로 구현된 백엔드가 Lombok을 사용하지 않는다는 것을 깨달았습니다. 그래서 JHipster를 사용하는 것이 최선의 방법이 아니라는 것을 깨닫고 lombok을 사용하도록 생성된 코드를 사용자 지정하기로 결정했습니다.

JHipster 커스터마이징



When I realized how awesome JHipster was 생성된 코드를 이전에 수동으로 입력했던 것과 같이 변경해야 한다고 생각했습니다. 그래서 다음과 같은 사용자 지정 주석을 사용하여 나만의 주석blueprint을 만들 수 있는 기회를 보았습니다.
  • 롬복 추가 - @lombok
  • 댓글 숨기기 - @noCodeComment
  • 데이터베이스 체계 변경 - @schema
  • 엔티티에 Id GeneratedValue 추가 - @generatedValue(identity)
  • 열 데이터베이스 이름 정의 - @column(ds_field)
  • 지원되지 않는 유형 사용 - @newFieldTypeImport(import_class_package_type) 및 @newFieldType(type)

  • 서버 측 코드를 사용자 정의하는 청사진 소스를 열었습니다.
  • generator-jhipster-custom-server-side-blueprint-private
  • 다음은 이러한 사용자 정의 주석 옵션을 구현하는 클래스입니다. https://github.com/renanfranca/generator-jhipster-custom-server-side-blueprint-private/blob/custom-annotations-options/generators/entity/index.js

  • 다음은 내 청사진을 사용하는 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 codethis 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 생성기 버전으로 청사진을 최신 상태로 유지하는 것은 쉬운 일이 아닙니다. 따라서 꼭 필요한 경우에만 청사진을 작성하는 것이 좋습니다.

    좋은 웹페이지 즐겨찾기