사진찍는 개발자 블로그

💻 개발 14

자바 스레드(Thread) 간단 정리

모든 자바 프로그램은 기본적으로 스레드를 사용한다. JVM이 실행되면 main 메서드를 실행할 주 스레드뿐 아니라 가비지 컬렉션이나 객체 종료(Object Finalization)와 같은 JVM 내부 작업을 담당할 스레드도 생성된다. 자바 언어에서 사용할 수 있는 스레드(Thread)는 크게 데몬 스레드(Daemon Thread)와 일반 스레드(Non-daemon thread)로 나뉜다. Daemon Thread 자바에서 데몬 스레드(Daemon Thread)는 다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이다. 다른 말로 하면 다른 스레드에 대한 백그라운드 스레드를 지원하는 특수한 스레드라고 할 수 있다. JVM이 처음 시작될 때 main 스레드를 제외하고 JVM이 내부적으로 사용기 ..

💻 개발/Java 2022.01.23

[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..

💻 개발/JPA 2021.09.19

Java - Object.clone()

최근 프로젝트를 진행하다가 clone() 메서드로 인스턴스를 복사한 후 복사된 인스턴스의 상태 값을 변경하면 원본 인스턴스의 값도 바뀌는 문제를 겪었었다. 해당 버그를 수정하면서 clone 메서드에 대해 찾아보고 테스트해본 내용을 정리해보려고 한다. clone() 메서드의 사용법 자바 Object 클래스의 clone() 메서드는 자바 언어에서 지원하는 객체 복사 메서드이지만 간단하게(?) 사용할 수 있는 메서드는 아니다. clone() 메서드의 선언부를 보면 아래와 같이 작성되어 있다. protected native Object clone() throws CloneNotSupportedException; 하나씩 살펴보자. 일단 접근 제한자가 protected로 되어있다. 복사하려는 객체 외부에서는 접근할..

💻 개발/Java 2020.09.26

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..

💻 개발/Java 2020.08.23

Guava EventBus 간단 사용법

Guava 라이브러리의 EventBus를 사용하면 굉장히 쉽고 간단하게 Publish/Subscribe 방식의 이벤트 처리를 구현할 수 있다. 회사 프로젝트 코드에서도 많이 사용하고 있어서 간단하게 정리해봤다. EventBus 생성 EventBus는 이벤트를 처리할 각 이벤트 리스너를 등록하고 각 리스너에게 이벤트를 전파하는 역할을 수행한다. EventBus 객체는 다음과 같이 생성자를 호출해서 간단하게 생성할 수 있다. EventBus eventBus = new EventBus(); 혹은 생성자 파라미터에 문자열 값을 넘겨서 이벤트버스의 이름을 지정할 수 있다. EventBus eventBus = new EventBus("myEventBus"); 참고로 이름을 설정하지 않으면 기본 이름은 "defaul..

💻 개발/Java 2020.08.07

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 값이 같은지를..

💻 개발/Java 2020.07.18

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을 실행한..

자바 컬렉션을 Null Safe 하게 정렬하기

자바 8에 도입된 스트림(Stream)을 사용하면 컬렉션을 쉽게 정렬할 수 있다. (Stream이 아니더라도 List 인터페이스의 sort() 메서드를 사용할 수도 있다.) 예를 들어 Member를 나이 순으로 정렬한다면 아래와 같이 할 수 있다. List memberList = Arrays.asList(Member.of(10), Member.of(5), Member.of(20)); List sortedMemberList = memberList.stream() .sorted(Comparator.comparing(Member::getAge)) // member의 age 속성을 기준으로 정렬한다. .collect(toList()); System.out.println(sortedMemberList); 결과 [..

💻 개발/Java 2020.07.04

Mac에서 카프카 설치하고 메시지 발행, 컨슘 해보기

카프카 공식 사이트에서 제공하는 Kafka Quickstart 문서(https://kafka.apache.org/quickstart)를 따라하면 로컬 환경에 간편하게 카프카를 설치하여 메시지를 발행하고 소비하는 등 테스트를 해볼 수 있다. 따라서 실습 한 내용을 정리해보았다. Apache Kafka Apache Kafka: A Distributed Streaming Platform. kafka.apache.org 사전 준비사항 카프카는 JVM 언어 중 하나인 스칼라(Scala)로 구현되어 있기 때문에 사전에 Java가 설치되어 있어야 한다. 카프카 다운로드 및 설치 카프카 설치는 비교적 간단하다. https://kafka.apache.org/downloads 페이지에 접속하여 바이너리 압축 파일을 원하는..

💻 개발/Kafka 2020.07.04

MySQL의 격리수준

트랜잭션 격리 수준이란? 트랜잭션의 격리 수준(Isolation level)이란 DB에 동시에 여러개의 트랜잭션이 처리될 때 특정 트랜잭션에서 변경 또는 조회하고 있는 데이터를 다른 트랜잭션이 어느 정도까지 조회할 수 있는지를 결정하는 것을 말한다. 말 그대로 서로 다른 트랜잭션들이 서로 어느 정도까지 격리가 되어야 하는지를 나타낸 것이다. 격리 수준은 크게 아래의 4가지로 나뉜다. Read Uncoommitted Read Committed Repeatable Read Serializable 위에서 아래로 갈 수록 트랜잭션간 격리 수준이 높아지며, 일반적으로 격리 수준이 높아질수록 동시성은 떨어지게 된다. Read Uncommitted 격리 수준이 Read Uncommitted 일 때는 각 트랜잭션서의 ..

💻 개발/MySQL 2020.06.28