스프링부트 - 어노테이션

Wald Eisen·2023년 7월 18일

study

목록 보기
15/26




https://azderica.github.io/00-spring-lombok/

생성자 생성 어노테이션, no-allArgsConstructor

모든 자바 클래스엔 생성자가 있다.
실제로, 막 자바 파일을 생성하면 생성자가 없는것처럼 보이지만,
실제로는 은밀하게 생성자가 존재한다.

이 어노테이션들은 asdf.this; 와 같은 생성자 생성 과정을 생략해준다.

@NoArgsConstructor 어노테이션은 파라미터가 없는 기본 생성자를 생성해주고, @AllArgsConstructor 어노테이션은 모든 필드 값을 파라미터로 받는 생성자를 만들어준다.

@getter? @setter?

이 둘은 롬복의 라이브러리로 사용할 수 있는 어노테이션이다.
용어자체는 롬북의 라이브러리가 아닌, 이미 정립되어있었던 거니 참고,

즉, 롬복 어노테이션의 게터 세터를 말하는건지, 그냥 자바에서의 게터세터를 말하는건지를 물어보는것도 좋음.

이들이 하는일은 각각 접근자(게터) / 설정자(세터) 자동 생성이다.


public class makingline {
    public double linex;
    public double liney;
}

다음 코드를 보면 맴버변수인 linex와 liney는 화면에 선을 그려주는 컨트롤러 의해서만 수정되어야 하지만

개발 과정에서 해당 값을 참조해야 하는 경우가 있기 때문에 변수를 public으로 선언했다.

그러나 이러면 누구든지 해당 변수에 직접 접근해서 값을 변경할 수 있는 문제가 있다.

이 문제를 온라인 게임, 예를 들어 메이플 스토리의 메소를 예로 들어보자.

저게 메소의 변수고 메소의 변수를 public으로 놔뒀는데 누군가가 여기에 접근해서 값을 바꿀 수 있다면?

당연히 그로 인한 파장은 이루 말할수가 없을것이다.

이럴 때 getter를 활용하면 예외상황을 사전에 차단할 수 있다.

즉, 캡슐화를 해주는 어노테이션이라고 하면 편하다.

## @Getter
public class makingline {
    private double linex;
    private double liney;
    
    
    ## 바로 이 아래를 생략해주는게 @Getter 메소드다.
    public double getLineX() {
        return linex;
    }

    public double getLineY() {
        return liney;
    }
}

@Setter

위의 게터를 보았다면 세터는 무엇을 하는건지 감이 올것이다.
저렇게 private 처리된 메서드를 받아오고, 수정을 할 수 있게 하는 권한을 준다.

@RequireConstortor

private나 non-null 값만 파라미터로 받는다는 어노테이션
새로운 필드를 추가할 때 다시 생성자를 만들어서 관리해야하는 번거로움을 없애준다. (@Autowired를 사용하지 않고 의존성 주입)

## 이것이 기존 코드고,
    @Service
    public class BannerServiceImpl implements BannerService {
    
        private BannerRepository bannerRepository;
    
        private CommonFileUtils commonFileUtils;
    
        @Autowired
        public BannerServiceImpl(BannerRepository bannerRepository, CommonFileUtils commonFileUtils) {
            this.bannerRepository = bannerRepository;
            this.commonFileUtils = commonFileUtils;
        }
## 이것이 해당 어노테이션을 적용한 코드다.
    @Service
    @RequiredArgsConstructor
    public class BannerServiceImpl implements BannerService {
    
        private final BannerRepository bannerRepository;
    
        private final CommonFileUtils commonFileUtils;
        ...

@EqualsAndHashCode?

equals와 ==의 차이점?
== 는 객체의 주소값만 확인하고
equals는 객체의 주소값을 확인하고 다르면 객체의 내용을 비교한다
게다가 이 이퀄스를 오버라이딩 가능

@EqualsAndHashCode(of="idx", callSuper = false)
이것만 같으면 허용되게?

@ToString?

일종의 자동생성. 단, 한번쓰면 저아래까지 계속해서 루프를
돌기에 DTO로 끊어주는 역할이 필요하다

exclude 속성을 사용하면 특정 필드를 toString() 에서
결과를 제거할 수 있다.

@Autowired?

디펜던시(의존) 인젝션(주입) 중 하나 inject response

메인 컨트롤러가 데이터를 가져올려면 service가 필요하다.
서비스에게 의존하고 있는 셈.

타입을 확실하게 직접 주입해 주겠다. 와 같은 선언 |

여기서 객체 생성과정이 우리가 new로 직접 하는게 아니라
스프링부트에서 알아서 해주는 방식인걸 주목해야 한다.

이걸 쓰는게 싫다면 private final 을 붙인 후
@requiredArgsConstructor 붙이면 된다.

Data

@tostring equals.. getter, setter, require..
를 합친 어노테이션,

단, tostring과 마찬가지로 순환참조가 발생하는 경우 문제가 발생. 이 경우엔 exclude로 끊어줄수도 없으니 불편하더라도 위에서처럼 따로 쓰는게 좋다.

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

아주 유용한 정보네요!

답글 달기
comment-user-thumbnail
2023년 7월 18일

이렇게 유익한 내용을 공유해주셔서 감사합니다.

답글 달기