Race condition이란? 임계영역(critical section: 공유 메모리에 접근하는 프로그램의 일부)이 두 개 이상의 스레드에 의해 동시에 실행되는 조건으로 정의할 수 있다. 다르게 말해 특정 공유 리소스를 얻기 위해 두개 이상의 스레드가 함께 경쟁하는 조건으로 정의.(동시성 버그, deadlock과 밀접한 연관이 있음) 이는 프로그램의 잘못된 동작으로 이어진다. 예시코드 3개의 쓰레드가 공유하는 변수 c의 값을 조정한다. public class Counter implements Runnable { private int c = 0; public void increment() { try { Thread.sleep(10); } catch (InterruptedException e) { //Aut..
프로그램과 프로세스 쓰레드의 개념을 명확히 알기 위해서는 우선 컴퓨터의 구조를 이해할 필요가 있다. 컴퓨터를 이루는 주요 구성 요소에는 중앙 처리 장치(CPU), 메모리(memory), 하드디스크(hard disk)가 있다. CPU는 연산을 수행해 실제 프로그램을 실행하는 장치이고, 가장 빠른 속도로 동작한다. 프로그램은 하드디스크에 저장된 파일들의 모임, 프로세스는 메모리상에 로딩된 프로그램을 의미한다. 메모리는 그때그때 필요한 부분만을 동적으로 로딩한다. 쓰레드(Thread)란? 오직 프로세스만 CPU를 사용할 수 있다. 프로세스를 구성하는 작업의 한 단위로 다르게 말해 쓰레드는 CPU를 사용하는 최소 단위라고도 말할 수 있다. 싱글스레드 프로세스: 프로세스 내에서 단 하나의 스레드만 작업 멀티스레드..
Iterator란? Iterator 인터페이스는 Collection과는 별개로 존재하는 인터페이스이다. java 1.2에서 발표된 인터페이스로 Java.util 패키지에 속해있으며 Java Collections Framework의 멤버다. Collection에 저장된 요소를 읽어오는 것을 표준화 한 인터페이스이다. Iterator 인터페이스 내부 메서드 hasNext() 다음 요소를 가지고 있으면 true 반환 next() 다음 요소를 반환 remove() 해당 iterator로 반환된 요소를 제거 forEachRemaining() 예외가 throw 될 때까지 각 나머지 요소에 대해 작업 수행 Iterable이란? Collection의 상위 인터페이스로(=모든 컬렉션은 Iterable 인터페이스를 구현한..
스트림(Stream) API란? 스트림 API는 람다식(Lambda Expression)을 이용한 기술 중 하나로 데이터 소스(컬렉션, 배열, 난수, 파일 등..)를 조작 및 가공, 변환하여 원하는 값으로 반환해주는 인터페이스를 의미한다. 스트림을 사용하기 위해서는 Java 1.8 이상의 버전을 사용해야 한다. 해당 인터페이스는 java.util.stream에 포함되어 있다. 람다식이란? 함수를 하나의 식으로 표현한 함수형 인터페이스. 함수를 람다식으로 표현하면 메소드의 이름이 없기 때문에 익명 함수(Anonymous Function)의 한 종류라고도 한다. 스트림(Stream) API의 특징 1. Stream은 원본의 데이터를 변경하지 않는다. Stream API는 원본 데이터를 조회하여 별도의 Str..
JVM이란? JVM은 JAVA Virtual Machine(자바 가상 머신)의 약자로, 자바 바이트 코드를 실행할 수 있는 주체이다. 자바 바이트 코드는 운영체제(OS)에 독립적이며 모든 JVM은 규격에 정의된 대로 자바 바이트 코드를 실행한다. 또한, JVM은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행한다. JVM의 동작 방식 자바 프로그램 실행시 동작 방식은 아래의 사진을 참고한다. 1) JVM이 OS로 부터 메모리를 할당받는다. 2) 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트 코드(.class)로 컴파일 한다 3) Class Loader는 동적 로딩을 통해 클래스들을 로딩 및 링크 하여 Runtime Data Area(실질적인 메모리를 할당..
Batch Insert란? batch insert는 여러 개의 SQL Statement를 하나의 구문으로 처리하는 것을 말한다. batch insert는 jdbc batch 기능이고, hibernate에서 write-behind(쓰기 지연)를 통해 처리한다. 여러 개의 구문을 합쳐 하나로 보내기 때문에 성능 개선을 할 수 있다. JPA는 트랜잭션이 commit 되는 순간 한꺼번에 flush가 이뤄진다. 사용방법 application.yml 파일을 아래와 같이 설정한다. spring: jpa: database: mysql properties: hibernate.jdbc.batch_size: 50 hibernate.order_inserts: true hibernate.order_updates: true hi..
EntityManagerFactory란? EntityManagerFactory는 EntityManager를 생성하는 인터페이스다. 최초 생성 시 커넥션풀 생성을 포함한 여러 작업들을 수행하여 생성비용이 비싸다. 일반적으로 애플리케이션에서 생성 후 하나의 인스턴스를 공유하도록 설계되어있다. 여러 스레드가 동시에 접근해도 안전하다. META-INF/persistence.xml에 설정한 정보를 기반으로 엔티티 매니저 팩토리를 생성한다. 아래와 같은 코드로 생성할 수 있다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); Spring Boot에서는 JPA 사용 시 application.properties 또는 applicat..
N+1 문제란? 연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수(N) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다. 즉, N+1문제는 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것을 말한다. When 언제 발생하는가? JPA Repository를 활용해 인터페이스 메소드를 호출할 때(Read 시) Who 누가 발생시키는가? 1:N 또는 N:1 관계를 가진 엔티티를 조회할 때 발생 How 어떤 상황에 발생되는가? JPA Fetch 전략이 EAGER 전략으로 데이터를 조회하는 경우 JPA Fetch 전략이 LAZY 전략으로 데이터를 가져온 이후 연관 관계인 하위 엔티티를 다시 조회하는 경우 Why 왜 발생하는가..
연관관계 매핑이란? 객체의 참조와 테이블의 외래 키를 매핑하는 것을 의미한다. JPA에서는 연관 관계에 있는 상대 테이블의 PK를 멤버 변수로 갖지 않고, 엔티티 객체 자체를 통째로 참조한다. 방향 데이터 모델링에서는 관계를 맺어주기만 하면 자동으로 양방향 관계가 되어 서로 참조한다. 그러나 객체지향 모델링에서는 구현하고자 하는 서비스에 따라 단방향 관계인지 양방향 관계인지 적절한 선택이 필요하다. 단방향 관계 : 두 엔티티가 관계를 맺을 때, 한 쪽의 엔티티만 참조하고 있는 것 양방향 관계 : 두 엔티티가 관계를 맺을 떄, 양 쪽이 서로 참조하고 있는 것 다중성 어떤 엔티티를 중심으로 상대 엔티티를 바라보느냐에 따라 다중성이 달라진다. 관계에 있는 두 엔티티는 아래 중 하나의 관계를 갖는다. 다중성은 ..
Spring MVC란? 어플리케이션의 확장을 위해 Model, View, Controller 세가지 영역으로 분리한 것으로, 컴포넌트의 변경이 다른 영역 컴포넌트에 영향을 미치치 않아 유지보수에 용이하다. 또한, 컴포넌트간의 결합성이 낮아 프로그램 수정이 용이하다. Model : 로직(Business & DB)을 처리하기 위한 모든 것으로 Cotroller로 부터 넘어온 data를 이용하여 이를 수행후 그에 대한 결과를 다시 controller에 리턴한다. (Dao, Service) View : 모든 화면 처리를 담당한다. Client의 요청에 대한 결과뿐 아니라 controller에 요청을 보내는 화면단도 jsp에서 처리한다. 결과 출력을 위한 코드만 존재한다. (JSP) Controller : Cli..