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