전체 글

Jisung Jung의 기술블로그
Backend, Spring

[JPA] JPA 지연로딩과 N+1 문제

JPA 즉시로딩과 지연로딩 즉시로딩: Entity를 불러올때 연관된 Entity를 즉시 fetch해서 함께 불러온다. 지연로딩: 연관된 Entity가 필요할때 fetch해서 불러온다. //default 로딩 전략은 FetchType.EAGER @ManyToOne(fetch = FetchType.LAZY) @OneToOne(fetch = FetchType.LAZY) Entity 1개 조회할때 @Test @Transactional void findOne() { //fetchType이 EAGER일때: findOne을 호출하면 team도 함께 1차 캐시에 올라온다. -> query 총 1번 //fetchType이 LAZY일때: //findOne을 호출하면 user를 가져오기 위한 query 1번이 실행되고 fe..

Database

[Database] RDBMS 정규화

RDBMS에서 정규화란 테이블간의 중복 데이터를 최소화하는 전략을 말한다. 정규화는 중복 데이터를 별도의 테이블로 분리하는 1차 정규화, 복합키와 관련 칼럼을 종속 테이블로 분리하는 2차 정규화 등 여러 단계가 있는데 상황에 맞게 각 단계의 정규화 프로세스를 적용할 수 있다. 정규화를 수행하면 데이터의 중복성을 줄이고 무결성을 보장할 수 있지만, 그만큼 테이블간의 관계가 복잡해지기 때문에 적절한 정규화 단계를 적용하는것이 중요하다. 정규화와 대비되는 개념으로는 중복 데이터를 허용해 성능 향상을 기대하는 개념인 반정규화가 있다. 실제 현업에서도 성능을 고려해 중복데이터를 적절하게 허용한다고 한다.

Database

[Database] RDBMS과 NoSQL

NoSQL과 RDBMS의 차이는 데이터의 저장 방식에 있다. NoSQL은 비관계형 데이터베이스 형식으로 Key-Value 형태의 데이터가 관계 없이 저장되고, RDBMS는 관계형 데이터베이스 형식으로 규격화된 테이블에 데이터가 저장되고 각 테이블은 연관관계를 가질 수 있다. NoSQL은 가볍고 빨라 대용량 데이터를 처리하는데 유리하다는 장점이 있지만, 단순한 구조로 복잡한 데이터를 저장할 수 없고 간단한 쿼리만 이용할 수 있다는 단점이 있다. 반면 RDBMS는 무거운만큼 데이터의 무결성, 보안, 복잡한 쿼리 처리가 가능하다는 장점이 있고, 규모 확장의 어려움과 유연성이 부족하다는 단점이 있다.

Java

[Java] 메모리 구조

T 메모리 구조 JDK를 이용해 개발된 자바 애플리케이션이 JRE에 의해 JVM상에서 실행되면 OS는 JVM에 메모리를 할당한다. 이때, 자바 애플리케이션은 JVM이 OS로부터 할당받은 메모리를 사용하게 된다. 기계어를 포함한 모든 프로그래밍 언어의 공통된 메모리 사용 방식은 아래와 같은데 코드 실행 영역과 데이터 저장 영역으로 나누어진다. 코드 실행 영역은 프로그램의 코드가 저장되는 영역으로 텍스트영역이라고도 부른다. 자바 실행 파일(.java)를 컴파일러가 바이트 파일(.class)로 바꿔 JVM 메모리에 로드하는데 이때 바이트파일이 저장되는 곳이 코드 실행 영역이다. 데이터 저장 영역은 프로그램의 데이터가 저장되는 메모리 영역인데 OOP에서는 우리가 잘 아는 Static, Stack, Heap의..

NBCamp

[KPT 회고록] Trello 서버 개발

심화프로젝트 팀과제 "Trello" 만들기 KPT 회고 https://github.com/SpartaTrelloA08/SpartaTrelloA08Backend GitHub - SpartaTrelloA08/SpartaTrelloA08Backend: SpartaTrelloA08Backend SpartaTrelloA08Backend. Contribute to SpartaTrelloA08/SpartaTrelloA08Backend development by creating an account on GitHub. github.com KEEP 협업시에 정형화된 PR양식과 코드리뷰를 활용하니 누가 어떤 기능을 개발했는지와 전체적인 프로젝트 진행 흐름을 파악할 수 있어 좋았습니다. Postman을 사용하지않고 Servi..

Backend, Spring

[Spring] Spring AOP

Spring AOP(Aspect-Oriented Programming) Spring AOP에서 AOP는 Aspect-Oriented Programming으로 관점 지향 프로그래밍을 의미한다. 관점 지향 프로그래밍이란 관심사를 적절히 나누자는 것인데 AOP에서는 이를 공통 관심 사항(cross-cutting concern)과 핵심 관심 사항(core concern)으로 분리한다. AOP라는 말에서 OOP와 대치될 것 같다는 느낌을 받을 수 있지만, 전혀 그렇지 않고 AOP는 오히려 더욱더 OOP의 관점으로 프로그래밍 할 수 있도록 도와준다. Spring AOP 예제 - 메소드의 호출 시간 측정 AOP에 대해 공부하면서 많은 자료를 찾아봤는데 거의 모든 자료에서 AOP의 예제로 메소드의 호출 시간을 측정하는..

Algorithm

[Algorithm] Two Pointer 투 포인터

Two Pointer Algorithm 투 포인터 알고리즘은 연속되는 1차원 배열 또는 리스트를 순차적으로 접근할때 사용하는 알고리즘이다. 이름 그대로 시작점과 끝점을 가리키는 두 개의 포인터를 이용하여 부분배열을 탐색한다. 투 포인터 알고리즘을 사용하는 이유는 당연히 배열 탐색시 시간복잡도에서의 효율을 위해서이다. 예를 들어, 길이가 100인 배열(0 포함)에서 합이 15가되는 부분배열 중 길이가 가장 짧은 배열을 찾아야한다고 해보자. 첫번째 원소부터 차례대로 탐색한다면 99번 원소에 15가 있다고 할때 최악의 경우로 약 O(n^2/2)의 시간복잡도를 가질 것이다. 투 포인터 알고리즘의 예제와 투 포인터 알고리즘을 사용한다면 시간복잡도가 어떻게 나오는지 살펴보자. 아래는 투 포인터 알고리즘을 적용할 ..

Backend, Spring

[JPA] ORM 표준 JPA의 탄생 배경

ORM(Object-Relational Mapping) ORM이란 말그대로 객체와 관계형 데이터베이스를 직접 매핑해 사용하는 전략을 말한다. Spring을 이용하면 @Entity를 이용해 객체와 실제 RDB의 테이블을 매핑해 개발하는데 이러한 방식이 ORM 전략을 따르는 것이다. 자바에서는 이러한 ORM의 표준 명세로 JPA(Java Persistance API)를 사용하고 있다. JPA(Java Persistance API) JPA는 위에서 설명한바와 같이 자바에서 제공하는 인터페이스로 어떤 기능을 제공하는 라이브러리가 아니다. JPA는 ORM 전략을 따르는 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지에 대해 정의한 기술 명세서이다. JPA와 같이 Hibernate에 대해서도 많이..

Java

[Java] Collection

Java Collection Framework 자바에서는 효율적인 데이터의 추가 · 삭제 · 검색 등을 돕기 위한 자료구조 인터페이스들을 java.util 패키지에 포함시켜 놓았다. 이들을 Collection Framework라고 총칭하며 우리가 자주 사용하는 List , Set, Map이 대표적이다. 아래 그림을 보면 Collection Framework는 크게 Collection 인터페이스와 Map 인터페이스로 나뉜다. List, Set의 경우 객체를 추가 · 삭제 · 검색하는 방법에 공통점이 있기 때문에 Collection 인터페이스를 정의해 이를 확장하는 방식으로 사용하고 있다. 기술블로그를 쓰면서 Inpa님의 글을 많이 참고하는데 ArrayList, HashMap 등 Collection의 실..

Jisung Jung
Jisung Jung의 기술블로그