티스토리 뷰

Java & Kotlin

[Java] Lombok이란? 및 Lombok 활용법

망나니개발자 2020. 6. 10. 16:02
반응형

Java 언어를 이용해 개발을 하다 보면 기계적으로 작성해야 하는 코드들이 상당히 많다. 이번에는 기계적인 코드 작성을 자동화하여 코드 다이어트를 해주는 Java 필수 라이브러리 Lombok에 대해 알아보도록 하겠다.

 

 

1. Lombok의 필요성 


[ 기존의 코드 작성 ]

예를 들어 우리가 경기도 지역화폐 가맹점에 대한 상점 목록을 반환해주는 SpringBoot 기반의 API 서버를 개발한다고 가정하자. 우리는 기존에 Java를 활용하여 프로젝트를 개발할 때 다양한 VO 클래스들을 생성하였고, 해당 예제의 경우 가게들의 정보를 저장하는 Store를 아래와 같이 만들어줄 수 있다.

 

public class Store extends Common {

    private String companyName;                                 // 상호명
    private String industryTypeCode;                            // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getIndustryTypeCode() {
        return industryTypeCode;
    }

    public void setIndustryTypeCode(String industryTypeCode) {
        this.industryTypeCode = industryTypeCode;
    }

    public String getBusinessCodeName() {
        return businessCodeName;
    }

    public void setBusinessCodeName(String businessCodeName) {
        this.businessCodeName = businessCodeName;
    }

    public String getIndustryName() {
        return industryName;
    }

    public void setIndustryName(String industryName) {
        this.industryName = industryName;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public String getRegionMoneyName() {
        return regionMoneyName;
    }

    public void setRegionMoneyName(String regionMoneyName) {
        this.regionMoneyName = regionMoneyName;
    }

    public boolean isBmoneyPossible() {
        return isBmoneyPossible;
    }

    public void setBmoneyPossible(boolean bmoneyPossible) {
        isBmoneyPossible = bmoneyPossible;
    }

    public boolean isCardPossible() {
        return isCardPossible;
    }

    public void setCardPossible(boolean cardPossible) {
        isCardPossible = cardPossible;
    }

    public boolean isMobilePossible() {
        return isMobilePossible;
    }

    public void setMobilePossible(boolean mobilePossible) {
        isMobilePossible = mobilePossible;
    }

    public String getLotnoAddr() {
        return lotnoAddr;
    }

    public void setLotnoAddr(String lotnoAddr) {
        this.lotnoAddr = lotnoAddr;
    }

    public String getRoadAddr() {
        return roadAddr;
    }

    public void setRoadAddr(String roadAddr) {
        this.roadAddr = roadAddr;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public String getSigunCode() {
        return sigunCode;
    }

    public void setSigunCode(String sigunCode) {
        this.sigunCode = sigunCode;
    }

    public String getSigunName() {
        return sigunName;
    }

    public void setSigunName(String sigunName) {
        this.sigunName = sigunName;
    }

}

 

[ Lombok 이란? ]

Lombok이란 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리이다. Lombok을 이용하면 Getter, Setter, Equlas, ToString 등과 다양한 방면의 코드를 자동완성 시킬 수 있다.

만약 위의 Store에서 생성자도 필요하고, toString 함수도 Override 해야하는 등 추가적인 작업이 필요하다면 1개의 VO 클래스만 해도 상당히 길어지고, 코드의 가독성은 떨어지는 등의 단점이 있다. 만약 위의 클래스에 Lombok을 적용한다면 아래와 같이 단순화시킬 수 있다. (실무에서 Lombok을 활용할 때에는 모든 변수들에 대해 Setter를 사용하지 않지만, 예제에서는 단순화를 위해 모든 변수에 대해 @Setter를 적용시키도록 하겠습니다.)

@Getter
@Setter
public class Store extends Common {

    private String companyName;                                 // 상호명
    private String industryTypeCode;                            // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름

}

 

위와 아래의 클래스만 보아도 Lombok을 활용하면 엄청난 양의 업무량과 코드 다이어트를 얻을 수 있음을 명확하게 확인할 수 있다.

 

 

[ Lombok의 장점 ]

  • 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
  • 반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상
  • Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능

Lombok을 사용하면 정말 많은 이점을 얻을 수 있다. 과거에는 IntelliJ에서 롬복 플러그인을 모든 팀원이 설치해주어야 한다는 단점도 있었지만 현재는 IntelliJ의 기본 플러그인이 되면서 바로 편리하게 이용가능하게 되었다.

 

 

2. Lombok 기능 및 사용 예제


[ @Getter @Setter ]

Lombok에서 가장 자주 활용하는 어노테이션이다. @Getter와 @Setter를 클래스 이름 위에 적용시키면 모든 변수들에 적용이 가능하고, 변수 이름 위에 적용시키면 해당 변수들만 적용 가능하다. 아래의 예제에서는 모든 변수들에 대해 Getter 메소드를 만들고 상호병 변수에 대해서만 Setter 메소드를 만들어보도록 하겠다.

 

@Getter
public class Store extends Common {

    @Setter
    private String companyName;                                 // 상호명
    private String industryTypeCode;                            // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름

}

 

위와 같이 코드를 작성하면, 모든 변수에 대해 Getter를 사용할 수 있지만, Setter의 경우 companyName에 대해서만 생기게 된다.

 

 

 

[ @AllArgsConstructor ]

@AllArgsConstructor는 모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다. @AllArgsConstructor를 활용한 예제는 아래와 같다.

@Getter
@AllArgsConstructor
public class Store extends Common {

    private String companyName;                                 // 상호명
    private String industryTypeCode;                            // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름

    /* AllArgsConstructor를 통해 아래의 생성자를 자동 생성할 수 있다.
    public Store(String companyName, String industryTypeCode, String businessCodeName, String industryName, String telephone,
    String regionMoneyName, boolean isBmoneyPossible, boolean isCardPossible, boolean isMobilePossible, String lotnoAddr,
    String roadAddr, String zipCode, double longitude, double latitude, String sigunCode, String sigunName) {
        this.companyName = companyName;
        this.industryTypeCode = industryTypeCode;
        this.businessCodeName = businessCodeName;
        this.industryName = industryName;
        this.telephone = telephone;
        this.regionMoneyName = regionMoneyName;
        this.isBmoneyPossible = isBmoneyPossible;
        this.isCardPossible = isCardPossible;
        this.isMobilePossible = isMobilePossible;
        this.lotnoAddr = lotnoAddr;
        this.roadAddr = roadAddr;
        this.zipCode = zipCode;
        this.longitude = longitude;
        this.latitude = latitude;
        this.sigunCode = sigunCode;
        this.sigunName = sigunName;
    }
    */
}

 

 

[ @NoArgsConstructor ]

@NoArgsConstructor는 어떠한 변수도 사용하지 않는 기본 생성자를 자동완성 시켜주는 어노테이션이다. @NoArgsConstructor를 활용한 예제는 아래와 같다

 

@Getter
@NoArgsConstructor
public class Store extends Common {

    private String companyName;                                 // 상호명
    private String industryTypeCode;                            // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름

    /* NoArgsConstructor를 통해 아래의 생성자를 자동 생성할 수 있다.
    public Store() {

    }
    */
}

 

[ @RequiredArgsConstructor ]

@RequiredArgsConstructor는 특정 변수만을 활용하는 생성자를 자동완성 시켜주는 어노테이션이다. 생성자의 인자로 추가할 변수에 @NonNull 어노테이션을 붙여서 해당 변수를 생성자의 인자로 추가할 수 있다. 아니면 해당 변수를 final로 선언해도 의존성을 주입받을 수 있다.

@RequiredArgsConstructor를 활용한 예제는 아래와 같다

@Getter
@RequiredArgsConstructor
public class Store extends Common {

    @NonNull
    private String companyName;                                 // 상호명
    private final String industryTypeCode;                      // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름

    /* RequiredArgsConstructor 통해 아래의 생성자를 자동 생성할 수 있다.
    public Store(String companyName, String industryTypeCode) {
        this.companyName = companyName;
        this.industryTypeCode = industryTypeCode;
    }
    */

}

 

[ @EqualsAndHashCode ]

@EqualsAndHashCode 어노테이션을 활용하면 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해준다. 만약 서로 다른 두 객체에서 특정 변수의 이름이 똑같은 경우 같은 객체로 판단을 하고 싶다면 아래와 같이 해줄 수 있다.

 

@RequiredArgsConstructor
@EqualsAndHashCode(of = {"companyName", "industryTypeCode"}, callSuper = false))
public class Store extends Common {

    @NonNull
    private String companyName;                                 // 상호명
    @NonNull
    private String industryTypeCode;                            // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름

}

 

위의 Store에서는 @EqualsAndHashCode(of = {"companyName", "industryTypeCode"}) 로 설정하여 companyName과 industryTypeCode가 동일하다면 같은 객체로 인식하도록 해주고 있다. 또한 Common를 상속하고 있는데, 상위 클래스의 경우 적용시키지 않기 위해 callSuper=false로 해주었다.

 

@RestController
@RequestMapping(value = "/store")
@Log4j2
public class StoreController {

    @GetMapping(value = "/test")
    private ResponseEntity test(){        
        Store store1 = new Store("가게 이름", "업종코드1");
        Store store2 = new Store("가게 이름", "업종코드1");
        Store store3 = new Store("가게 이름", "업종코드2");
        
        // "companyName과 industryTypeCode가 같기 때문에 true가 나옴
        log.debug(store1.equals(store2));
        
        // "companyName과 industryTypeCode가 다르기 때문에 false가 나옴
        log.debug(store1.equals(store3));

        return ResponseEntity.ok().build();
    }

}

 

 

[ @ToString ]

@ToString 어노테이션을 활용하면 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다. 출력을 원하지 않는 변수에 @ToString.Exclude 어노테이션을 붙여주면 출력을 제외할 수 있다. 또한 상위 클래스에 대해도 toString을 적용시키고자 한다면 상위 클래스에 @ToString(callSuper = true) 를 적용시키면 된다. 

 

@ToString
@AllArgsConstructor
public class Store extends Common {

    @ToString.Exclude
    private String companyName;                                 // 상호명
    private String industryTypeCode;                            // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름

}

 

위의 예제에서는 companyName의 변수에 @ToString.Exclude를 붙여주었기 때문에 아래와 같이 companyName을 출력하지 않고 있음을 확인할 수 있다.

 

[ @Data ]

@Data 어노테이션을 활용하면 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다. 실무에서는 너무 무겁고 객체의 안정성을 지키기 때문에 @Data의 활용을 지양한다.

 

[ @Builder ]

@Builder 어노테이션을 활용하면 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다. 모든 변수들에 대해 build하기를 원한다면 클래스 위에 @Builder를 붙이면 되지만, 특정 변수만을 build하기 원한다면 생성자를 작성하고 그 위에 @Builder 어노테이션을 붙여주면 된다.

 

@Getter
@NoArgsConstructor
public class Store extends Common {

    private String companyName;                                 // 상호명
    private String industryTypeCode;                            // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름

    @Builder
    public Store(String companyName, String industryTypeCode){
        this.companyName = companyName;
        this.industryTypeCode = industryTypeCode;
    }
    
}

 

위와 같이 작성한 부분을 실제 활용한다면 아래와 같이 사용할 수 있다.

@RestController
@RequestMapping(value = "/store")
@Log4j2
public class StoreController {

    @GetMapping(value = "/init")
    private ResponseEntity init(){
        Store store = Store.builder()
                .companyName("회사이름")
                .industryTypeCode("업종코드")
                .build();

        return ResponseEntity.ok(store);
    }

}

 

[ @Delegate ]

@Delegate 어노테이션은 한 객체의 메소드를 다른 객체로 위임시켜 준다. 만약 어떤 Store에 Review를 추가하는 상황이라고 가정을 하자(실제에서는 DB를 활용하겠지만 아래의 예제는 @Delegate를 이해하기 위해 작성한 것입니다)

 

@AllArgsConstructor
@Getter
public class Review extends Common {

    private String userName;
    private String contents;

}

 같이 리뷰를 작성한 사람의 이름과 내용을 갖는 Review가 있다고 하자.

 

@Getter
@NoArgsConstructor
public class Store extends Common {

    private String companyName;                                 // 상호명
    private String industryTypeCode;                            // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름
    @Delegate
    private List<Review> reviewList;

}

 그리고 위와 같이 Store가 Review의 List를 갖는다고 할 때, reviewList에서 사용하는 함수들을 Store로 위임시켜서 코드를 편리하게 작성하도록 도와준다.

 

@RestController
@RequestMapping(value = "/store")
@Log4j2
public class StoreController {

    @GetMapping(value = "/test")
    private ResponseEntity test(@RequestBody Store store){
        Review review = new Review("글쓴이", "내용"); 
        
        // 기존의 방식
        store.getReviewList().add(review);
        // @Delegate를 활용한 방식
        store.add(review);

        return ResponseEntity.ok(store);
    }

}

 

 

[ @Log 관련 어노테이션 ]

@Log4j2와 같은 어노테이션을 활용하면 해당 클래스의 로그 클래스를 자동 완성 시켜준다. @Log 관련 어노테이션을 활용한 예제는 아래와 같다.

@RestController
@RequestMapping(value = "/store")
@Log4j2
public class StoreController {

    @GetMapping(value = "/log")
    private ResponseEntity log(){
        log.error("Error");
        return ResponseEntity.ok().build();
    }

}

 

 

 

3. Lombok 실무 사용 예제


[ Lombok의 올바른 예제 ]

@Entity
@Table(name = "store")
@ToString(exclude = "regionMoneyName", callSuper = true)
@Getter
@NoArgsConstructor
@EqualsAndHashCode(of = {"companyName", "roadAddr"}, callSuper = false)
public class Store extends Common {

    private String companyName;                                 // 상호명
    private String industryTypeCode;                            // 업종코드
    private String businessCodeName;                            // 업태명
    private String industryName;                                // 업종명(종목명)
    private String telephone;                                   // 전화번호
    private String regionMoneyName;                             // 사용가능한 지역화폐 명
    private boolean isBmoneyPossible;                           // 지류형 지역화폐 사용가능 여부
    private boolean isCardPossible;                             // 카드형 지역화폐 사용가능 여부
    private boolean isMobilePossible;                           // 모바일형 지역화폐 사용가능 여부
    private String lotnoAddr;                                   // 소재지 지번주소
    private String roadAddr;                                    // 소재지 도로명주소
    private String zipCode;                                     // 우편번호
    private double longitude;                                   // 경도
    private double latitude;                                    // 위도
    private String sigunCode;                                   // 시군 코드
    private String sigunName;                                   // 시군 이름

    @Builder
    public Store(String companyName, String industryTypeCode){
        this.companyName = companyName;
        this.industryTypeCode = industryTypeCode;
    }
    
}

상점 목록들 같은 경우 경기 공공데이터에서 제공받은 내용들에 동일한 상점 정보가 중복되어 들어간 경우가 있다. 그래서 상호명과 도로명주소가 같은 상점인 경우 같은 객체로 처리하기 위해 compayName과 industryTypeCode에 대해 @EqualsHashCode 어노테이션을 적용하고 있다. 또한 regionMoneyName는 데이터가 비어있는 경우가 많기 때문에 @ToString 메소드에서 제외해주었다. @Builder 패턴의 경우 적절한 데이터를 사용하여 해당 클래스를 빌드할 수 있다.

 

 

@Service
@RequiredArgsConstructor
public class StoreService {

    private final StoreRepository storeRepository;

    public List<Store> findAll() {
        return storeRepository.findAll();
    }

    public Store save(Store store) {
        return storeRepository.save(store);
    }

    public Optional<Store> findById(Long id) {
        return storeRepository.findById(id);
    }
    
    public List<Store> findAllByCompanyName(String searchKeyWord) {
        return storeRepository.findAllByCompanyNameLike(searchKeyWord);
    }

}

그리고 위와 같은 StoreService는 StoreRepository를 가지고 있는데, @RequiredArgsConstructor를 사용하고, StoreRepository에 final 키워드를 붙여서, StoreService가 Spring Container에 Bean 등록이 될 때 StoreRepository를 주입시켜준다. 

 

자세한 예제는 아래의 깃허브를 참고하면 된다.

https://github.com/MangKyu/lombok-Example

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/12   »
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
글 보관함