전체 글 19

회고 - 비동기 처리

최근에 새로 프로젝트를 하나 시작했는데요! Riot API를 통해서 전적 검색 API를 개발하고 있던 중이였습니다. 바로 사용자가 플레이 한 기록을 조회하는 API, 전적 갱신입니다 리그오브레전드에는 한 판에 10명의 플레이어가 존재하고, 그 안에 굉장히 많은 정보가 담기게 되는데요, 그래서 이를 구현하기 위해서는 해야할 것이 몇 가지 있습니다. 이름으로 최근 전적 Id List 조회 전적 List의 상세 정보 조회 전적 별 플레이어 정보 조회 그러나 전적 조회를 할 때마다 외부 API에 의존하면서 다시 조회하는 것은 리소스 낭비라고 생각해서 첫 플레이어 조회 시에 이를 저장하는 것까지 하기로 하였습니다 ( 그러지 말았어야 했다 ) 개발은 순조롭게 진행되고 있었고, 이 전적 갱신이 아주 원활하게 이루어지..

삽질 일기 2022.12.08

[kotlin] Coroutine - 개념 이해

Coroutine 이란 ? 코루틴을 알기 전에 프로세스와 스레드를 조금 이해해보도록 하자, 프로세스는 메모리 공간을 할당 받아 실행 중인 프로그램을 뜻하고, 스레드는 이 실행 중인 프로그램 안에서 작업을 실행하는 여러 단위이다. 즉 실행 중인 프로그램 안에서 실행되는 작업의 단위가 스레드인 것인데, 이 스레드는 경량 프로세스라고도 불린다. 하지만 스레드는 문맥 교환(Context Switching) 시에 많은 비용이 소요되어 자원을 낭비하는데, 이를 해결하기 위해 더욱 업그레이드 한 것이 경량 스레드라 불리우는 'Coroutine' 이다. 코루틴의 특징으로는 동시성 프로그래밍 협력형 멀티태스킹 협력형 멀티태스킹 멀티 태스킹 : 하나의 CPU 코어로 여러 개의 작업을 하는 것을 의미한다. 협력형 멀티 태스..

Kotlin 2022.12.01

스레드(Thread) - 개념, 동시성

Thread 란? Process: 데이터와 메모리, 스레드 등의 자원에 메모리 공간을 할당받아 실행 중인 프로그램 Thread : 프로세스 내에서 실제로 작업을 실행하는 여러 작업의 한 단위 스레드는 독립된 메모리 영역인 Stack을 갖는다. 스레드는 다른 스레드와 스택 메모리를 공유할 수 없다 프로세스의 힙은 속한 모든 Thread가 공유할 수 있다. 이 자원을 공유할 수 있기에 같은 자원을 두고 동시에 여러 가지 일을 수행할 수 있다. Thread 구현 방법 Runnable 인터페이스 구현 Thread 클래스 상속 다중 상속이 불가능하므로 보통은 Runnable 인터페이스를 구현하는 방법으로 스레드를 생성한다. kotlin에선 thread()를 통해 Thread 클래스를 상속하고 있어, thread ..

Java 2022.11.29

[Spring] Spring Cache

Cache ? 캐시란 자주 사용하는 데이터를 저장해서 사용하는 기술를 뜻합니다. 캐시는 동일한 요청에 유사한 내용의 데이터를 반복적으로 반환해야 할 때 사용합니다. 간단히 설명하자면, 어느 한 교실에 학생과 선생님이 있습니다. 학생이 선생님에게 궁금한 점을 한 가지 질문하고 선생님은 학생에게 답변을 해줍니다. 하지만 학생이 매일매일 똑같은 질문을 또 반복합니다. 여기서 만약 학생이 선생님에게 한 질문의 답을 메모를 통해 질문에 대한 답을 기억했더라면, 굳이 선생님께 다시 질문을 하지 않았을 겁니다. 캐시는 이럴 때 필요합니다. 동일한 리소스(궁금증)를 반복적으로 조회(질문) 하게 되면 DB(선생님)에 부담이 되겠죠, 하지만 이 리소스를 따로 메모(저장) 해두어 조회할 때마다 DB가 아닌 메모를 통해 빠르..

Spring 2022.09.05

[Java] 가비지 컬렉션 (Garbage Collection GC)

해당 글의 내용 중 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다! 자바를 사용하다보면 객체를 생성하기만 하지 개발자가 직접 객체의 생명주기를 관리하진 않았는데요 객체를 생성하고 소멸하는 것은 개발자가 컨트롤하지 않는데 어떻게 객체가 알아서 소멸되고 관리되는 것일까 궁금해져 알아보게 되었습니다! 가비지 컬렉션(Garbage Collection) 가비지 컬렉션이란 자바에서 객체가 할당한 Jvm Heap 영역 중 더 이상 참조되지 않는 객체들을 해제하는 작업을 의미합니다. Stop the World 가비지 컬렉션이 동작할 때는 따로 스레드를 두고 동작하는 것이 아닌, 실행되고 있는 모든 스레드를 중단하고 가비지 컬렉션을 실행합니다. GC의 성능 개선을 위해 튜닝 을 한다고 하면이 중단 시간을 줄이는 것..

Java 2022.08.13

[SOLID] ISP | 인터페이스 분리 원칙 (Interface Segregation Principle)

[SOLID] ISP | 인터페이스 분리 원칙 해당 글은 LSP와 추상화에 대해 이해하고 계시면 더욱 이해하기 쉽습니다. 추상화가 궁금하시다면 https://eojil-hyunin-in.tistory.com/3 이 글을 읽어주세요! 우선 ISP의 정의부터 뭔지 알아보죠! 인터페이스 분리 원칙은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다. 인터페이스는 객체가 사용하는 메서드를 정의해놓는 설계도와 같은 역할을 가집니다. 예시 아래 예시들은 기능을 구현하는 클래스들은 인터페이스로부터 구현을 받아야 한다는 전제하에 설명된 예시들입니다. ISP를 지키는 예시를 설명하자면 자동차에 존재하는 기능들은 전진, 후진, 정지, 가속 등등 여러 기능들이 존재합니다. public interfa..

Java/SOLID 2022.04.21

[SOLID] OCP | 개방 폐쇄의 원칙 (Open Closed Principle)

[SOLID] OCP | 개방 폐쇄의 원칙 (Open Closed Principle) 개방 폐쇄의 원칙 : 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다 즉, "개방 폐쇄의 원칙의 핵심은 기존 코드를 건드리지 않는다는 것입니다." 어떻게 기존 코드를 수정하지 않고 확장할 수 있는 거지? OCP를 알지 못한 상태의 설계는 잘못 되어있을 가능성이 높습니다 따라서 개방 폐쇄의 원칙을 지키기는 어렵습니다 그러므로 코드의 "설계"부터 바꾸어야 합니다. 기존 설계 방식 기존의 설계 방식을 셰프가 요리를 내어주는 과정을 통해 기존의 설계 방식이 왜 잘못되었는 지를 알아봅시다. 기존에는 셰프가 음식을 요리하여 직접 손님에게 제공하였습니다. 이런 설계라면 손님이 많을 때는 셰프가 손님을 오래 기다리게..

Java/SOLID 2022.04.14

[SOLID] LSP | 리스코프 치환 원칙 (Liskov Substitution Principle)

[SOLID] LSP | 리스코프 치환 원칙 (Liskov Substitution Principle) 부모 클래스를 상속받은 자식 클래스로도 부모 클래스의 메소드들을 동작할 수 있어야 하는 원칙입니다. 다시 말해 부모 클래스로 짜인 코드를 자식 클래스로 변경하였을 때도 원활하게 프로그램이 동작할 수 있어야 합니다. 예시 예를 들어 부모와 자식이 있습니다. 부모는 자동차를 운전할 줄 압니다. 자식은 운전하는 방법을 부모로부터 습득(상속)합니다. 부모로부터 운전하는 방법을 습득한 자식은 부모 대신 운전을 할 수 있어야 합니다. 리스코프 치환 원칙에 대해 알아보기 위해, 원칙을 위반하는 동물/고양이 예제를 통해 알아봅시다. public class Animal { public String getName() { ..

Java/SOLID 2022.04.13

추상 클래스 vs 인터페이스

추상 클래스 vs 인터페이스 추상 클래스와 인터페이스의 차이점을 설명해주세요 이 글은 해당 질문의 대한 답을 하기 위해 작성되었습니다! 지금 이 글을 읽고 계신 여러분도 이에 대한 답을 알고싶다면 이 질문을 잘 기억하셨다가 글을 다 읽어보고 답을 내려보시면 좋겠습니다! 추상화란? 우선 추상 클래스를 알기 전 추상 클래스 앞에 붙어있는 추상에 대한 것부터 알아보죠 추상화 : 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것 이처럼 추상화는 구체적인 사물들간의 공통점을 취하고 차이점을 버리는 일반화를 사용하거나, 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거함으로써 간결하게 만듭니다. 요점은 불필요한 코드를 제거하고 중요한 부분을 살리는 것입니다. 예를들어 우리가 자동..

Java 2022.04.12