본문 바로가기
Spring|Spring-boot

Lombok

by oncerun 2020. 8. 3.
반응형

Lombok은 annotation Processor를 이용해 자동으로 코드를 만들어 줍니다.

예를 들면  @setter ,@getter를 사용하면 

public void setMemberId(){} 와같은 코드를 작성하지 않아도 됩니다.

 



import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Restaurant {

    @Id
    @GeneratedValue
    private Long  id;

    private String name;

    private String address;

    @Transient
    private List<MenuItem> menuItems  = new ArrayList<>();

    public Restaurant() {
    }

    public Restaurant(String name, String address) {
        this.name = name;
        this.address = address;
    }

    public Restaurant(Long id, String name, String address) {
        this.name = name;
        this.address = address;
        this.id = id;
    }



    public void setId(long id) {
        this.id = id;
    }

    public Long getId() {

        return id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {

        return this.address;
    }

    public String getInformation(){

        return  name + " in " + address;

    }

    public List<MenuItem> getMenuItems(){

            return menuItems;
    }

    public void addMenuItem(MenuItem menuItem) {

        this.menuItems.add(menuItem);
    }

    public void setMenuItems(List<MenuItem> menuItems) {

        for(MenuItem menuItem : menuItems){

            addMenuItem(menuItem);

        }
    }

    public void updateInformation(String name, String address) {
        this.name = name;
        this.address = address;
    }
}

여기서 단순히 정보를 얻어온다거나 설정한다는 코드를 전부 간단하게 Lombok을 이용해 보겠습니다.

 

그전에 라이브러리를 확인해야합니다.

 

 

다음과 같이 Lombok을 다운로드하여줍니다.

이제 Restaurant의 모든 getter를 삭제하겠습니다. 

그다음 test를 진행해보죠

package kr.co.fastcampus.eatgo.domain;

import lombok.Getter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
public class Restaurant {

    @Id
    @GeneratedValue
    private Long  id;

    private String name;

    private String address;

    @Transient
    private List<MenuItem> menuItems  = new ArrayList<>();

    public Restaurant() {
    }

    public Restaurant(String name, String address) {
        this.name = name;
        this.address = address;
    }
    public Restaurant(Long id, String name, String address) {
        this.name = name;
        this.address = address;
        this.id = id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getInformation(){

        return  name + " in " + address;

    }



    public void addMenuItem(MenuItem menuItem) {

        this.menuItems.add(menuItem);
    }

    public void setMenuItems(List<MenuItem> menuItems) {

        for(MenuItem menuItem : menuItems){

            addMenuItem(menuItem);

        }
    }

    public void updateInformation(String name, String address) {
        this.name = name;
        this.address = address;
    }
}

 

 

다음과 같이 getter가 존재하지 않아도 test가 성공적으로 진행된 것을 확인할 수 있다. 

해당 클래스의 @Getter을 이용하면 모든 멤버 변수의 getter를 생성해준다.!!

만약 해당 멤버 변수에만 붙여주게 되면 멤버 변수의 getter만 생성해준다.

 

@NoArgsConstructor를 사용하면 비어있는 생성자까지 만들어 준다. 

@AllArgsConstructor를 이용 모든 args가 존재하는 생성자를 만들어 준다.

 

이제 builder패턴을 이용해보자 좀 더 깔끔한 방식으로 객체를 생성할 수 있다. 

//  Restaurant restaurant = new Restaurant(1004L,"Bob zip", "Seoul");

        Restaurant restaurant = Restaurant.builder()
                .id(1004L)
                .name("Bob zip")
                .address("Seoul")
                .build();

코드 읽기와  유지보수가 편리해진다는 장점이 존재합니다.

 

이러한 Lombok은 코드량을 줄여주는 장점을 가지고 있지만 의도치 않은 객체의 getter setter로 인해 접근을 허용할 수 도 있기에 어느 순간에 적절하게 사용해야 합니다.

반응형

'Spring|Spring-boot' 카테고리의 다른 글

회원가입을 위한 Spring security  (0) 2020.08.09
Gradle 멀티 모듈  (0) 2020.08.06
[Spring] Interceptor , ArgumentResolver  (0) 2020.07.20
[Spring] Spring security  (0) 2020.07.20
[Spring] Spring MVC Session  (0) 2020.07.20

댓글