HoT
- 동기화(synchronization)와 Thread Safe 제대로 이해하기 싱글스레드 프로세스의 경우 프로세스 내에서 단 하나의 스레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별문제가 없지만, 멀티스레드 프로세스의 경우 여러 스레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 됩니다. 한 스레드가 진행 중인 작업을 다른 스레드가 간섭하지 못하도록 막는 것을 '스레드의 동기화(synchronization)'라고 합니다. 자바의 synchronized 키워드를 이용하면 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장합니다. 다시 말해서 스레드의 배타적 실행을 보장합니다. 여기까지는 알고 있었던 동기화에 대한 개념이었습니다. 그러나 이펙티브 자바(Effective Java)의 아이템 78을 읽다보면 이런 내용이 나옵니다. 동..
- @Configuration과 proxyBeanMethods 자바 코드로 빈 등록하기 스프링 @Configuration 클래스의 @Bean 메서드를 활용하여 자바코드로 빈 등록을 할 수 있다. 아래 학습 테스트 코드를 살펴보자 class ConfigurationTest { @Test void configuration() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(); ac.register(MyConfig.class); ac.refresh(); BeanA bean1 = ac.getBean(Bean1.class); BeanB bean2 = ac.getBean(Bean2.class); Assertions.assertThat(bean1.item).isSameAs(bean..
- Set과 Hash Table Set은 중복된 원소를 포함하지 않고 순서가 상관없는 원소들의 컬렉션을 나타내는 개념으로 집합의 개념과 같다.(집합 역시 {1, 9, 6, 4}처럼 중복과 순서가 없다.) Set은 여러 가지 방법으로 구현될 수 있지만, 가장 일반적으로 사용되는 구현 방법은 해시 테이블(Hash Table)을 기반으로 한다. 해시 테이블에서는 Key가 중복될 수 없고 데이터는 순차적이 아니라 랜덤하게 저장한다. 해시 테이블의 이런 특징은 Set의 개념과 일치하기 때문에 Set을 구현할 때는 해시 테이블의 Key에 데이터를 저장하는 형태로 구현을 하게 된다. Hash Table 해시 테이블은 (Key, Value)로 데이터를 저장하는 자료구조 중 하나로 빠르게 데이터를 검색할 수 있는 자료구조다. 해시 테이블이 빠른 검색속..
- 자바8 람다식의 등장 자바8에서 함수형 인터페이스, 람다와 같은 개념이 추가되면서 함수 객체를 더 쉽게 만들 수 있게 되었습니다. 간단한 프로그램을 기존 자바 코드로 해결하면서 발생하는 문제를 자바8에서 새롭게 추가된 개념들을 이용해 어떻게 개선할 수 있는지 비교해볼 예정입니다. 예제 1. 과일 재고 프로그램 과일 재고 목록을 관리하는 애플리케이션을 만들어보겠습니다. 최초 요구사항은 "녹색 사과를 모두 찾고싶다" 입니다. 코드는 다음과 같습니다. public static List filterGreenApples(List inventory) { List result = new ArrayList(); for (Apple apple : inventory) { if ("green".equals(apple.getColor())) { ..
- Java에서 Enum 의 비교는 '==' 인가? 'equals' 인가? 자바에서 Enum은 클래스의 인스턴스가 JVM 내에 하나만 존재한다는 것이 100% 보장되는 싱글톤을 만드는 가장 좋은 방법입니다. (JLS, 8.9 Enum Types) 그렇다면 Enum 비교시 equals 메서드 대신 간단히 == 비교를 사용하면 어떨까요? 1. == 비교는 NullPointerException을 발생시키지 않습니다. enum Color { BLACK, WHITE }; Color nothing = null; if (nothing == Color.BLACK); // runs fine if (nothing.equals(Color.BLACK)); // throws NullPointerException equals 메서드를 사용해 비교하면 런타임에 NullPointerException가 발생..
- List와 Set의 차이 List와 Set은 실무에서 자주 쓰는 개념이다. 두 타입의 차이를 잘 알고 있다면 기본기도 탄탄하게 하고 상황에 따라 List를 쓰는게 더 유리한지 Set을 쓰는게 더 유리한지 판단하는데 도움이 될 것이다. 개념적인 차이 List 같은 종류의 아이템을 저장 순서를 보장 중복을 허용 Set 같은 종류의 아이템을 저장 순서를 보장하지 않음 중복을 허용하지 않음 개념적인 차이를 필자가 좋아하는 야구를 주제로 간단한 예시를 들어 설명해보면 올해 한국 프로야구에서 한번이라도 홈런을 친 선수(모든 선수의 이름은 다 다르다고 가정)를 저장하려면 List와 Set 중에서 어떤 타입을 쓰는게 좋을까? 예시를 잘 살펴보면 모든 선수들의 이름은 다 다르다고 가정했으니 홈런을 친 선수들을 저장할때 중복을 허용할 필요가 없어..
- 자바와 다중상속 문제 다른 객체지향언어인 C++에서는 여러 조상 클래스로부터 상속받는 것이 가능한 '다중상속(multiple inheritance)' 을 허용하지만 자바에서는 오직 단일 상속만을 허용합니다. 사실 다중상속 문제는 수년동안 논쟁의 여지가 있는 문제로 다루어져 왔습니다. 지금부터 다중 상속의 가장 대표적인 문제로 꼽히는 다이아몬드 문제(Diamond Problem) 을 통해서 그 이유에 대해 살펴보겠습니다. The diamond problem 다음과 같이 추상 메서드를 가진 Sample 추상 클래스가 있습니다. public abstract class Sample { public abstract void demo(); } 여기서Sample 클래스를 상속받아 demo 메서드를 구현하는 두 개의 클래스가 있습니다. p..
NEW
- @Configuration과 proxyBeanMethods 자바 코드로 빈 등록하기 스프링 @Configuration 클래스의 @Bean 메서드를 활용하여 자바코드로 빈 등록을 할 수 있다. 아래 학습 테스트 코드를 살펴보자 class ConfigurationTest { @Test void configuration() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(); ac.register(MyConfig.class); ac.refresh(); BeanA bean1 = ac.getBean(Bean1.class); BeanB bean2 = ac.getBean(Bean2.class); Assertions.assertThat(bean1.item).isSameAs(bean..
- 스레드 풀(Thread pool) 제대로 이해하기 Thread per request model 백엔드 API 서버에서 요청을 처리하는 여러가지 방식이 있는데 그 중 하나가 Thread per request model 이다. Thread per request model 에서는 하나의 API Request 는 하나의 Thread가 처리하게 되는 구조다. 만약 Thread per request 모델의 동작 방식이 서버에서 들어오는 요청마다 스레드를 새로 만들어서 처리하고 처리가 끝난 스레드는 버리는 식으로 동작한다면 어떤 문제점이 있을까? 우선 스레드 생성/수거 작업은 OS의 kernel 레벨에서 이루어지는 꽤나 비싼 작업이다. 따라서 요청이 올때마다 스레드를 생성하게 되면 스레드 생성에 소요되는 시간 때문에 요청 처리가 더 오래 걸릴 것이다. 또한 요청마다..
- Set과 Hash Table Set은 중복된 원소를 포함하지 않고 순서가 상관없는 원소들의 컬렉션을 나타내는 개념으로 집합의 개념과 같다.(집합 역시 {1, 9, 6, 4}처럼 중복과 순서가 없다.) Set은 여러 가지 방법으로 구현될 수 있지만, 가장 일반적으로 사용되는 구현 방법은 해시 테이블(Hash Table)을 기반으로 한다. 해시 테이블에서는 Key가 중복될 수 없고 데이터는 순차적이 아니라 랜덤하게 저장한다. 해시 테이블의 이런 특징은 Set의 개념과 일치하기 때문에 Set을 구현할 때는 해시 테이블의 Key에 데이터를 저장하는 형태로 구현을 하게 된다. Hash Table 해시 테이블은 (Key, Value)로 데이터를 저장하는 자료구조 중 하나로 빠르게 데이터를 검색할 수 있는 자료구조다. 해시 테이블이 빠른 검색속..
- List와 Set의 차이 List와 Set은 실무에서 자주 쓰는 개념이다. 두 타입의 차이를 잘 알고 있다면 기본기도 탄탄하게 하고 상황에 따라 List를 쓰는게 더 유리한지 Set을 쓰는게 더 유리한지 판단하는데 도움이 될 것이다. 개념적인 차이 List 같은 종류의 아이템을 저장 순서를 보장 중복을 허용 Set 같은 종류의 아이템을 저장 순서를 보장하지 않음 중복을 허용하지 않음 개념적인 차이를 필자가 좋아하는 야구를 주제로 간단한 예시를 들어 설명해보면 올해 한국 프로야구에서 한번이라도 홈런을 친 선수(모든 선수의 이름은 다 다르다고 가정)를 저장하려면 List와 Set 중에서 어떤 타입을 쓰는게 좋을까? 예시를 잘 살펴보면 모든 선수들의 이름은 다 다르다고 가정했으니 홈런을 친 선수들을 저장할때 중복을 허용할 필요가 없어..
- Amazon Linux 서버에 SonarQube 설치하기 정적 코드 분석 정적 코드 분석은 코드내에서 발견할 수 있는 코드 스멜, 잠재적인 결함, 컨벤션 체크, 보안 취약점 등을 코드 레벨에서 분석해서 레포팅 해준다. 컨벤션 교정 수준이 아니라, 잠재적 문제가 될만한 코드, 안티패턴의 코드들을 다 시스템이 찾아주고 수정안을 제안하기 때문에 코드리뷰에 들어가는 비용도 줄일 수 있다. 이런 정적 코드 분석 도구에는 대표적으로 pmd, SonarQube, cppcheck, checkstyle 등 여러가지가 있지만, 가장 많은 사용자들이 사용하는 도구는 SonarQube(소나큐브) 이다. 이 글에서는 AWS EC2 인스턴스에 SonarQube 서버를 설치하는 방법을 설명하려고 한다. AMI(Amazon Machine Image)는 Amazon Linux 2로 진행한다..
- AWS EC2 인스턴스 생성하기 EC2(Elastic Compute Cloud) AWS에서 무료료 제공하는 프리티어 플랜에서는 EC2사용에 다음과 같은 제한이 있다. 사양이 t2.micro만 가능 vCPI(가상 CPU) 1 Core, 메모리 1GB 보통 vCPU는 물리 CPU사양의 절반 정도의 성능을 가짐 월 750시간의 제한이 있으며 초과하면 비용이 부과됨 24시간 * 31일 = 744시간 즉, 1대의 t2.micro만 사용한다면 24시간 켜놔도 요금이 부과되지 않음 리전(Region) 리전이란 AWS의 서비스가 구동될 지역을 이야기한다. AWS는 도시별로 클라우드 센터를 지어 해당 센터에서 구축된 가상머신들을 사용할 수 있다. 국내에서 서비스한다면 서울 리전을 선택해야 네트워크가 가장 빠르다. 인스턴스 시작 AMI(Amazon Ma..
- Java에서 Enum 의 비교는 '==' 인가? 'equals' 인가? 자바에서 Enum은 클래스의 인스턴스가 JVM 내에 하나만 존재한다는 것이 100% 보장되는 싱글톤을 만드는 가장 좋은 방법입니다. (JLS, 8.9 Enum Types) 그렇다면 Enum 비교시 equals 메서드 대신 간단히 == 비교를 사용하면 어떨까요? 1. == 비교는 NullPointerException을 발생시키지 않습니다. enum Color { BLACK, WHITE }; Color nothing = null; if (nothing == Color.BLACK); // runs fine if (nothing.equals(Color.BLACK)); // throws NullPointerException equals 메서드를 사용해 비교하면 런타임에 NullPointerException가 발생..
- 자바와 다중상속 문제 다른 객체지향언어인 C++에서는 여러 조상 클래스로부터 상속받는 것이 가능한 '다중상속(multiple inheritance)' 을 허용하지만 자바에서는 오직 단일 상속만을 허용합니다. 사실 다중상속 문제는 수년동안 논쟁의 여지가 있는 문제로 다루어져 왔습니다. 지금부터 다중 상속의 가장 대표적인 문제로 꼽히는 다이아몬드 문제(Diamond Problem) 을 통해서 그 이유에 대해 살펴보겠습니다. The diamond problem 다음과 같이 추상 메서드를 가진 Sample 추상 클래스가 있습니다. public abstract class Sample { public abstract void demo(); } 여기서Sample 클래스를 상속받아 demo 메서드를 구현하는 두 개의 클래스가 있습니다. p..
- 자바8 람다식의 등장 자바8에서 함수형 인터페이스, 람다와 같은 개념이 추가되면서 함수 객체를 더 쉽게 만들 수 있게 되었습니다. 간단한 프로그램을 기존 자바 코드로 해결하면서 발생하는 문제를 자바8에서 새롭게 추가된 개념들을 이용해 어떻게 개선할 수 있는지 비교해볼 예정입니다. 예제 1. 과일 재고 프로그램 과일 재고 목록을 관리하는 애플리케이션을 만들어보겠습니다. 최초 요구사항은 "녹색 사과를 모두 찾고싶다" 입니다. 코드는 다음과 같습니다. public static List filterGreenApples(List inventory) { List result = new ArrayList(); for (Apple apple : inventory) { if ("green".equals(apple.getColor())) { ..
- 동기화(synchronization)와 Thread Safe 제대로 이해하기 싱글스레드 프로세스의 경우 프로세스 내에서 단 하나의 스레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별문제가 없지만, 멀티스레드 프로세스의 경우 여러 스레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 됩니다. 한 스레드가 진행 중인 작업을 다른 스레드가 간섭하지 못하도록 막는 것을 '스레드의 동기화(synchronization)'라고 합니다. 자바의 synchronized 키워드를 이용하면 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장합니다. 다시 말해서 스레드의 배타적 실행을 보장합니다. 여기까지는 알고 있었던 동기화에 대한 개념이었습니다. 그러나 이펙티브 자바(Effective Java)의 아이템 78을 읽다보면 이런 내용이 나옵니다. 동..
반응형