TIL 20240815 - 자바 프로젝트 메모 (1)

2024. 8. 15. 16:24개발일지

자바로 개인 프로젝트를 시작하고자 한다.

 

잠깐 부모님 일을 도와드린 적이 있는데

전산일을 하면서 그 프로그램의 노후? 불편함이 있어서

내가 한번 만들어볼까? 싶어서 만들게 되었다...

 

자바로 프로젝트 시작하기 앞서 모르는 부분을 블로그에 정리를 해보고자 한다. 

 

코틀린으로 프로젝트를 할 때의 차이랄까? 

그런거나 새롭게 알게 된 부분을 위주로 작성할 것이다...

 

 

1. lombok?

 

코틀린과 다르게 자바에서는 lombok이라는 게 있었다.

 

아니 대체 이게 뭘까?

찾아보니 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리 라고 한다... 

그래서 이를 이용하면 Getter, Setter, Equlas, ToString 등과 다양한 방면의 코드를 자동완성 시킬 수 있다고 한다.

또한 

어노테이션 기반의 코드 자동 생성을 통한 생산성 향상,

반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상,

Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능하다는 이점이 있다... 

 

대표적인 어노테이션을 간단히 정리하자면,

 

- @Getter, @Setter 

클래스 이름 위에 적용시키면 모든 변수들에 적용이 가능하고, 변수 이름 위에 적용시키면 해당 변수들만 적용 가능하다.

 

- @AllArgsConstructor는 모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다.

 

- @NoArgsConstructor는 어떠한 변수도 사용하지 않는 기본 생성자를 자동완성 시켜주는 어노테이션이다.

 

- @RequiredArgsConstructor는 특정 변수만을 활용하는 생성자를 자동완성 시켜주는 어노테이션이다.

 

- @EqualsAndHashCode 어노테이션을 활용하면 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해준다.

 

- @ToString 어노테이션을 활용하면 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다. 

 

- @Data 어노테이션을 활용하면 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다. 

 

- @Builder 어노테이션을 활용하면 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다.

 

- @Delegate 어노테이션은 한 객체의 메소드를 다른 객체로 위임시켜 준다.

 

- @Log4j2와 같은 어노테이션을 활용하면 해당 클래스의 로그 클래스를 자동 완성 시켜준다. 

 

 

 

 

 

2. record

 

그 다음에 dto을 작성해줄때 코틀린 경우 data class로 작성해주는데,

자바로 된 프로젝트를 살펴보니 record를 사용하는게 아니겠는가?

 

찾아보니

record는 Java 14에서 처음 소개된 새로운 클래스 타입으로, 변경 불가(immutable) 데이터 객체를 쉽게 만들 수 있게 한다. 또한 record는 기존의 클래스와 비슷하지만, 더 간결하고 효율적으로 데이터 객체를 생성할 수 있도록 설계되었다.

 

특징으로는 

 

-간결성(Conciseness)
record는 코드를 간결하게 만들기 위한 목적으로 도입되었다고 한다.... 필드를 정의하면 해당 필드를 기반으로 자동으로 메서드가 생성되어 코드의 양을 줄일 수 있고, 불필요한 보일러플레이트 코드를 줄여 가독성을 높여준다. 아래의 예시 코드를 보면 확연히 알 수 있다.

 

- 메서드 자동 생성(Automatic Method Generation)
record는 필드를 기반으로 equals(), hashCode(), toString() 메서드를 자동으로 생성한다. 이로써 불필요한 반복적인 코드 작성을 피할 수 있다.

- 생성자 자동 생성(Automatic Constructor Generation)
record는 필드를 기반으로 자동으로 생성자를 생성하지만 필요에 따라 명시적인 생성자를 정의할 수도 있다.

- 불변성(Immutability)
record는 필드가 한 번 설정되면 값을 변경할 수 없다. 이는 불변성을 보장하며 데이터의 안정성을 높이는 데 도움이 된다고 한다.

 

- final 선언 생략
record의 필드를 final로 선언할 필요가 없기 때문에 Compiler는 필드를 불변으로 취급하고 자동으로 final로 처리한다.

- 패턴 매칭(Pattern Matching) 통합
record는 Java의 Pattern Matching과 함께 사용될 수 있어, 데이터 추출 및 패턴 일치 검사에 효과적으로 사용될 수 있다고 한다.

- 데이터 전달(Data Transfer)
record의 주된 목적은 객체 간에 불변 데이터를 전달하는 것으로,  DTO(Data Transfer Object)를 표현하는 데 적합하다.

 

public final class User {

    private final Long id;
    private final String email;
    private final String name;

    public User(Long id, String email, String name) {
        this.id = id;
        this.email = email;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public String getEmail() {
        return email;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "User{" +
            "id=" + id +
            ", email='" + email + '\'' +
            ", name='" + name + '\'' +
            '}';
    }
}

 

public record User(
Long id,
String email,
String name
) {

}

 

이런식으로 record를 사용하면 한층 더 간결하게 사용이 가능하다고 한다.

 

 

 

참고해서 본 블로그와 레퍼렌스다.!

https://blog.hexabrain.net/399

 

38편. 레코드(Record)

도입 단순하게 데이터를 한쪽에서 다른 한쪽으로 전달하기 위해서만 사용되는 데이터 전송 객체(혹은 DTO)를 생각해봅시다. 이런 객체를 사용하는 이유는 다양한 집계 연산을 수행한 후의 결과

blog.hexabrain.net

 

https://www.baeldung.com/java-record-keyword

 

 

 

아니 진짜 자바를 공부하는데 다른게 꽤 있구나,,,

그래도 스펀지처럼 흡수해야지

파이팅