개인 프로젝트 도중 사용하게 되서 써본 글입니다. 앞으로 계속 공부를 이어나갈 예정입니다. 부족하지만 잘 부탁드립니다! 코루틴 소개 코루틴은 흔히 백엔드 개발자 사이에서 코틀린에서 제공하는 기능으로 착각하고 있는 분들이 많습니다. 하지만 Javascript, C#, Go 등 이미 여러 언어에서 지원하고 있는 개념이며 새로운 개념, 기술이 아닙니다. 코루틴 소개 전 CallBack 지옥에 대해서 알아보자 콜백 지옥은 함수형 패러다임을 적용한 언어에서 등장하는 형태입니다. 함수에서 최종적인 결과를 도출하기 위해 콜백 함수를 과도하게 호출하면 콜백 지옥이 생기게 되고 이러한 코드는 가독성을 떨어트리고 디버깅을 어렵게 만듭니다. 예를 들어 단순 주문을 하는 로직을 구현한다고 가정해 봅시다. memberRepos..
Thread 가시성이란 ? Thread 가시성이란 Thread의 시야 범위를 뜻한다. 공유하는 변수에 연산이 일어날 때 CPU를 점유하고 동작하는데 이 때 main memory에만 존재하는 것이 아니라 CPU cache에도 공유하는 자원에 대한 데이터가 들어있다. 이 때 CPU cache를 읽어오는데 언제 main memory에 옮겨갈 지 모르기 때문에 여러 thread가 동시에 읽음 연산과 쓰기 연산을 한다면 main memory에서 cache로 데이터를 옮기는 과정에서 다른 thread가 연산을 진행하여 결국 데이터 불일치 문제가 생기는 것이다. 이런 불일치 문제를 Thread 가시성 이슈라고 하며 자바에서는 volatile 키워드를 통해 해결할 수 있다. volatile은 캐시가 아닌 main me..
자세한 내용은 Github를 참고해주시기 바랍니다. 오늘은 레포지토리에 대해 얘기를 해보겠다. 레포지토리는 일단 설계부터 추상화를 이용해 구체화에 의존하지 않는 것이 핵심이라고 생각한다. 구체화에 의존하는게 왜? 객체지향을 공부했더라면 알 것이다. 구체화에 의존하는 것은 유지보수성을 떨어트린다. 우리가 알아야하는건 저장소이지 구체적으로 어떤 저장소인진 알아야할 이유가 전혀 없다. 오히려 그렇게 된다면 저장소가 바뀔 때마다 우리는 그에 맞춰 서비스도 바꿔주어야한다. 예를들어 우리는 QueryDSL을 이용하다가 갑자기 JOOQ로 넘어가야하는 상황을 가정해보자 그럴려면 우리는 JOOQ에 관련된 레포지토리를 만들고 그걸 서비스에 주입시켜줘야한다. 거기서 만약에 MyBatis까지 넣어준다면 MyBatis에 관련된..
자세한 내용은 Github를 참고해주시기 바랍니다. 자 이제 엔티티를 개발할 차례다. 사전에 먼저 용어 부터 정리하도록 하자. 도메인 모델패턴 DDD에서 정의한 도메인 모델을 먼저 간략하게 보면 다음과 같습니다. 전 글인 서비스 로직 구현에서 도메인 계층에 도메인 정보와 비즈니스 규칙을 정의한다고 했는데 그렇다 이렇게 정의 된 모델을 도메인 모델이라고 한다. 그리고 이러한 개발 패턴을 도메인 모델 패턴이라고 하는데 이러한 패턴은 객체 지향 언어를 이용해 개념 모델에 가깝게 구현할 수 있고 도메인 개념을 모델을 통해 한눈에 이해할 수 있게 할 수 있다는 장점이 있다. JPA 값 타입 JPA에서는 내장 타입을 이용해 식별관계 테이블을 정의할 수 있습니다. 이것을 이용해서 읽기 전용인 VO객체를 만들어 도메인..
Global Setting관련해서는 GitHub를 확인해주세요. (JWT와 Security는 매우매우 중요해서 추후 블로그 올립니다.) 우린 컨트롤러부터 서비스 엔티티 순으로 내려가며 개발할 예정입니다. 그렇다면 여기서 의문이 생길겁니다. 왜 컨트롤러부터 개발하나요 ? 먼저 제 생각을 말씀드리면 개발 속도와 깔끔한 아키텍처를 위해서 입니다. 저희는 개발하면서 Entity를 먼저 개발해왔지만 그런식의 개발은 Entity에 의존적인 개발을 할 수 없게 만들고 Entity에 의존적인 개발을 한다는 것은 결국 데이터 중심의 애플리케이션 개발이기 때문에 객체 중심의 개발이 이루어지는 요즘과는 맞지 않습니다. 그렇기 때문에 이벤트 기반으로 먼저 개발을 진행한 후 이벤트에 필요한 속성들을 모아 Entity를 개발하는..
블로그 프로젝트 시작이유 현대 백엔드 기술 중 가장 많이 쓰이는 기술들을 골라보라고 하면 대표적으로 Redis, Spring Boot, JPA 그리고 MySQL 등이 있습니다. 블로그 프로젝트는 이 기술들을 적절하게 사용하는 법을 제시할 예정입니다. 또한 FE와 협업하기위한 최적의 솔루션을 제시할 예정입니다. (본인피셜이니 거를 사람들은 걸러도 됩니다.) 혹시나 본인이 간단한 게시판 프로젝트를 통해서 실력을 높이고자 한다면 제 블로그를 보며 하는 것도 추천 드립니다. 그러면 우선 설계 부터 해봅시다. 블로그에서 일어날 수 있는 이벤트 들을 정리해보면 다음과 같습니다. 게시판 스터디 회원님 분들과 같이 작성한 이벤트 들입니다. 도메인 별로 이벤트를 나눴습니다. 그렇다면 이제 여기서 백엔드 영역의 기능들로 ..
Page 인터페이스 Paging을 위해서 Spring boot에서는 Page 인터페이스를 제공합니다. 이 인터페이스의 기본 스펙을 살펴보면 다음과 같습니다. { "content": [ ... (data) ], "pageable": { "sort": { "unsorted": false, "sorted": true, "empty": false }, "pageNumber": 0, "pageSize": 7, "offset": 0, "paged": true, "unpaged": false }, "last": true, "totalElements": 7, "totalPages": 1, "first": true, "numberOfElements": 7, "size": 7, "sort": { "unsorted": fa..
프로젝트를 진행 중에 최근 데이터를 정렬하라는 요구사항에 대해 빠르게 성능을 올리고 싶어 여러가지를 찾아보던 중 커버링 인덱스라는 개념을 발견했다. 인덱스 ? 인덱스는 데이터를 효율적으로 탐색하는 방법이다. 하나의 색인같은 것으로 MySQL 미리 정렬된 상태의 하나의 클러스링된 테이블이 존재하면 이 테이블에 접근하여 빠르게 해당 아이디 값을 찾아가는 방식으로 동작한다. 이 때 성능이 매우 빠르기 때문에 DB 성능향상을 위해 꼭 필요한 기술이다. 커버링 인덱스? 커버링 인덱스 는 쿼리를 충족하는데 필요한 모든 데이터를 갖는 인덱스를 뜻한다.(SELECT/WHERE/GROUP BY/ ORDER BY) 아까 인덱스에서 잠시 언급한 미리 정렬된 상태의 클러스터링된 테이블에 접근하여 데이터를 인덱스 테이블에서 조..
가상 머신과 도커 컨테이너 기존의 가상 머신은 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이었다. 이러한 방식은 커널 라이브러리 운영체제를 운영하기 위한 여러가지 리소스가 필요했고 그로인해 이미지의 크기가 매우 커진다. 그리고 하이퍼바이저를 반드시 반드시 거쳐야 하기에 일반 호스트에 비해 성능이 떨어진다. 즉 이렇게 무겁고 비효율적인 성능에 가상 머신을 이용할 이유가 없었다. 그래서 나온 것이 바로 docker다. 도커 컨테이너는 리눅스의 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다. 또한 컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용하여 OS가 빠지기 때문에 훨씬 적은 용량의 이미지 파일 구..
OneToOne은 기본적으로 Lazy 로딩을 지원하지 않는다. 그렇기 때문에 조회 시 Lazy로 설정 시 다음과 같은 문제가 발생한다. 일단 사전에 코드를 보여주면 다음과 같다. Member.java public class Member extends BaseTimeEntity { // 속성 ... // @OneToOne(mappedBy = "member", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) private MemberCount memberCount; // == 연관관계 로직 == // public void addMemberCount(final MemberCount memberCount) { this.memb..
- Total
- Today
- Yesterday
- 프로젝트
- 게시판
- 개발
- Redis
- 개발자
- Kotlin
- 취업준비
- 백엔드
- 동시성
- swarm
- docker
- 코딩
- DB
- 코드
- JPA
- 면접
- java
- 면접 준비
- 프로그래밍
- 취준
- 인터뷰
- DevOps
- IT
- 자바
- MySQL
- thread
- Spring
- 취업
- 면접준비
- CS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |