본문 바로가기

전체 글

(18)
자바 스레드(Thread) 간단 정리 모든 자바 프로그램은 기본적으로 스레드를 사용한다. JVM이 실행되면 main 메서드를 실행할 주 스레드뿐 아니라 가비지 컬렉션이나 객체 종료(Object Finalization)와 같은 JVM 내부 작업을 담당할 스레드도 생성된다. 자바 언어에서 사용할 수 있는 스레드(Thread)는 크게 데몬 스레드(Daemon Thread)와 일반 스레드(Non-daemon thread)로 나뉜다. Daemon Thread 자바에서 데몬 스레드(Daemon Thread)는 다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이다. 다른 말로 하면 다른 스레드에 대한 백그라운드 스레드를 지원하는 특수한 스레드라고 할 수 있다. JVM이 처음 시작될 때 main 스레드를 제외하고 JVM이 내부적으로 사용기 ..
[JPA] @ManyToOne 연관 관계와 Select 쿼리 JPA의 @ManyToOne JPA에서 엔티티 간의 다대일(N : 1) 연관 관계를 설정하기 위해서는 @ManyToOne 어노테이션을 사용하는데, 이 설정의 기본 페치 전략은 EAGER 즉, 즉시 로딩 전략으로 설정되어 있다. /** * (Optional) Whether the association should be lazily * loaded or must be eagerly fetched. The EAGER * strategy is a requirement on the persistence provider runtime that * the associated entity must be eagerly fetched. The LAZY * strategy is a hint to the persistence..
Java - Object.clone() 최근 프로젝트를 진행하다가 clone() 메서드로 인스턴스를 복사한 후 복사된 인스턴스의 상태 값을 변경하면 원본 인스턴스의 값도 바뀌는 문제를 겪었었다. 해당 버그를 수정하면서 clone 메서드에 대해 찾아보고 테스트해본 내용을 정리해보려고 한다. clone() 메서드의 사용법 자바 Object 클래스의 clone() 메서드는 자바 언어에서 지원하는 객체 복사 메서드이지만 간단하게(?) 사용할 수 있는 메서드는 아니다. clone() 메서드의 선언부를 보면 아래와 같이 작성되어 있다. protected native Object clone() throws CloneNotSupportedException; 하나씩 살펴보자. 일단 접근 제한자가 protected로 되어있다. 복사하려는 객체 외부에서는 접근할..
맥북 배터리 교체 + 써멀 재도포 어느 날부터인가 맥북 배터리가 부풀어 올라서 책상에 올려놔도 수평이 맞이 않아 흔들거리고 덮개도 완전히 잘 닫히지 않았다. 보통 집에서 사용할 때는 거치대에 거치해놓고 따로 키보드와 모니터를 연결해서 사용하기 때문에 별다른 불편함 없이 사용 해왔는데, 최근 인터넷 서핑을 하다가 배터리가 너무 부풀어서 트랙패드에 금이 가거나 심하면 폭발할 수 도 있기 때문에 빠르게 교체해야 한다는 글을 보고 배터리 교체를 하기로 결심했다. 이리저리 좀 찾아보니 이런 현상을 "배터리 스웰링" 현상이라고 한다. 구입한지 3년 이내에 배터리 스웰링이 발생할 경우 무상수리 대상이 된다고 하는데, 나는 2015년에 구입을 했기 때문에 무상수리 기간이 지나서 직접 교체를 하기로 했다. 배터리 구매 맥북프로 배터리는 쉽게 구매할 수 ..
Lombok - getter/setter의 prefix 관련 설정 Lombok(https://projectlombok.org/)의 @Getter, @Setter 어노테이션을 사용하면 getter, setter 메서드를 자동으로 생성 해주기 때문에 코드 작성량을 많이 줄여주어 실무에서 많이 사용된다. @Getter @Setter public class Member { private String name; private int age; private boolean active; } public class LombokTest { public static void main(String[] args) { Member member = new Member(); // 생성된 setter member.setName("jun"); member.setAge(30); member.setAc..
Guava EventBus 간단 사용법 Guava 라이브러리의 EventBus를 사용하면 굉장히 쉽고 간단하게 Publish/Subscribe 방식의 이벤트 처리를 구현할 수 있다. 회사 프로젝트 코드에서도 많이 사용하고 있어서 간단하게 정리해봤다. EventBus 생성 EventBus는 이벤트를 처리할 각 이벤트 리스너를 등록하고 각 리스너에게 이벤트를 전파하는 역할을 수행한다. EventBus 객체는 다음과 같이 생성자를 호출해서 간단하게 생성할 수 있다. EventBus eventBus = new EventBus(); 혹은 생성자 파라미터에 문자열 값을 넘겨서 이벤트버스의 이름을 지정할 수 있다. EventBus eventBus = new EventBus("myEventBus"); 참고로 이름을 설정하지 않으면 기본 이름은 "defaul..
Java BigDecimal 크기 비교하기 업무 중 BigDceimal 타입으로 된 가격을 비교하는 코드를 작성하다가 떠올라서 간단히 정리해봤다. 1. 동등 비교 두 개의 BigDecimal 값이 같은지 비교하기 위해 먼저 '==' 비교를 생각해 볼 수 있다. BigDecimal a = BigDecimal.valueOf(100.0); BigDecimal b = BigDecimal.valueOf(100.0); System.out.println(a == b); 위의 코드처럼 값이 100.0으로 동일한 2개의 BigDecimal을 == 연산자로 비교했을때 출력은 어떻게 될까? 쉽게 예상할 수 있듯이 답은 false 이다. 자바에서 == 연산자를 사용한 비교는 두 객체가 동일한 객체인지를 비교하는 것이기 때문이다. 사실 BigDecimal 값이 같은지를..
Postman - 환경별 API 테스트를 효율적으로 수행하기 실무에서 웹 서버 개발을 하게되면 다양한 환경에 서버를 배포하고 테스트 하게 된다. 보통은 로컬, 개발, 스테이지, 운영 환경 순서로 배포를 하고 테스트를 하게 되는데, Postman(https://www.postman.com/)의 환경변수 기능을 잘 활용하면 환경별 API 테스트를 좀 더 효율적으로 수행할 수 있다. 1. 환경(Environment) 추가하기 환경을 추가하기에 앞서 아래와 같은 4개의 환경 및 서버가 준비된 상황으로 가정하겠다. 환경 서버 URL local http://localhost:8080 develop http://api.todo-dev.com stage http://api-stage.todo.com production https://api.todo.com Postman을 실행한..