22.12

2 분 소요




lombok

@getter - prefix

lombok은 boolean 타입일 때 변수의 prefix가 is인 경우 getIsXXX 대신 isXXX 으로 get메서드를 만들어준다.

import lombok.Getter;

@Getter
public class Person {
    private boolean isMan;
    ...
}

이때 @Getter 로 만들어진 메서드는 getIsMan() 가 아니고 isMan() 가 된다.
결국 이 DTO 를 받을 경우 아래와 같다.

{
    "man": false
}

해결방법 1. boolean -> Boolean

@Getter
public class Person {
    private Boolean isMan;
    ...
}

원시타입 대신 래퍼타입을 사용한다.
하지만 래퍼타입이라 null값이 들어가게 되므로 지양하자

해결방법 2. get 메서드 직접 작성

@Getter
public class Person {
    private boolean isMan;
    ...

    public boolean getIsMan() {
        return isMan;
    }
}

@Builder

생성자 대신 builder 패턴 적용

@Getter
public class Person {
    private String name;
    private int age;

    @Builder
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    // 사용
    Person.builder().name("이름").age(1).build();
}


같은 이름과 같은 매게변수를 가진 메서드가 있으면 @Getter는 메서드를 생성하지 않는다.

@NoArgsConstructor

파라미터 없는 기본생성자

@NoArgsConstructor
public class Person {
    private String name;
    private int age;
}

// 기본생성자 생성
public Person() {
}

@AllArgsConstructor

모든 필드값을 파라미터로 받는 생성자

@AllArgsConstructor
public class Person {
    private String name;
    private int age;
}

// 모든 필드를 가진 생성자 생성
public Person(String name, int age) {
    this.name = name;
    this.age = age;
}

@RequireArgsConstructor

final이나 @NonNull인 필드 값만 파라미터로 받는 생성자 생성

@RequireArgsConstructor
public class Person {
    private final long id; 
    private String name;
    private int age;
}

// final이나 @NonNull인 필드를 가진 생성자 생성
public Person(long id) {
    this.id = id;
}

@Data

@Getter @Setter @ToString @EqualsAndHashCode @RequiredArgsConstructor 자동생성
최대한 지양하자

  • 무분별한 getter / setter 남용
  • ToString으로 인한 양방향 연관관계시 순환 참조 문제


maven / gradle

빌드관리도구

  • 소스코드에서 어플리케이션 생성을 하면서 여러가지 여부 라이브러리를 사용하는데, 빌드 관리 도구는 사용자가 직접 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리한다.

maven

  • java용 프로젝트 관리 도구로 Apache 의 Ant 대안으로 만들어졌다.
  • 빌드중인 프로젝트, 빌드순서, 외부라이브러리 종속성 관계를 pom.xml파일에 명시
  • 멀티프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속방식 사용

gradle

  • JVM의 스크립트 언어인 groovy로 만들어졌다.
  • 멀티프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 설정주입방식 사용

maven vs gradle

  • gradle 은 빌드시 변경된 파일만 작업하기 때문에 maven 보다 빠름 (10~100배)
  • gradle 은 스크립트 언어로 프로젝트가 커질수록 가독성이 maven 보다 좋음
  • gradle 이 멀티 프로젝트에 maven보다 적합하다.


OOM (java Out Of Memory)

자바의 메모리

자바는 가비지컬렉터로 메모리 관리를 한다.
덕분에 개발자는 메모리에 큰 신경을 쓰지 않고 코드를 작성할수 있다
하지만 가비지컬렉터가 정리해야 할 메모리가 정리되지 못하고 계속 메모리에 남아있게 되는걸 Memory Leak(메모리 누수) 라고 한다.
메모리 릭이 계속 될 경우 결국 JVM이 종료되고 만다.
메모리 릭의 양이 아주 작고 메모리는 많은 경우에는 주기적으로 JVM을 재시작 하면서 크게 신경안써도 될 경우도 있지만, 메모리릭이 빠르게 증가하는 경우에는 반드시 해결해줘야 한다

왜 발생?

메모리가 부족하기 때문이다. 한정된 서버 자원에 여러 어플리케이션을 띄운다던가
static같은 정적 메모리를 남발하여 지워지지 않고 계속 쌓일경우 이다.

어떻게 찾을까?

  1. JVM이 oom 에러로 정지된걸 확인
  2. 정지된 JVM 메모리영역을 확인했더니 특정 영역이 Full로 가득차있고, GC후 메모리할당에 실패하는걸 확인
  3. 코드레벨 (대게 싱글톤이나 static 잘못사용)
  4. 쓰레드생성이나 JNI에서 oom이 일어날 경우 OS의 자원소진일 수 있다. 이경우 외부자원을 조심스럽게 쓰던지 외부자원량을 늘림
  5. 외부 라이브러리가 많을 경우 문제해결이 쉽지않다. JVM옵션과 tool의 도움을 받자
  6. 옵션 추가
    • JVM 시작시 -verbose:gc옵션을 추가 - 가비지콜렉션 로그를 자세히 볼수있음
    • JVM 시작시에 -XX:+HeapDumpOnOutOfMemoryError 추가 - JVM 정지시에 힙덤프를 받아놓을수 있음
    • JVM 시작시에 –verbose:class옵션을 추가 - 클래스 로드, 언로드 상황을 볼수 있음
  7. 힙덤프 내역을 분석

함수형





태그:

카테고리:

업데이트:

댓글남기기