mgyo
-
About me
About me
2021.07.21Hi There 👋 Hello, I'm MINGYO KIM! I am a Software Engineer from South Korea 🇰🇷. I am interested in backend, data science and machine learning and Quant. If you want to contact me, please leave me a message! Please wait. Loading github.com/mgyokim ....
Hot
-
Trade-Off(구조의 안정성 vs 단순한 개발의 편리성)
Trade-Off(구조의 안정성 vs 단순한 개발의 편리성)
2023.04.07Trade-Off(구조의 안정성 vs 단순한 개발의 편리성) 스프링 데이터 JPA 예제를 수행한 것을 다시 한번 돌아보며, 느낀 것들을 기록한다. 우선, DI, OCP를 지키기 위해 어댑터를 도입한 코드의 클래스 의존 관계와, 런타임 객체 의존 관계를 살펴보자. 중간에서 JpaItemRepositoryV2가 어댑터 역할을 해준 덕분에 ItemService가 사용하는 ItemRepository 인터페이스를 그대로 유지할 수 있고, 클라이언트인 ItemService의 코드를 변경하지 않아도 되는 장점이 있다. 그런데, 여기서 고민이 생긴다. 구조를 맞추기 위해서, 중간에 어댑터가 들어가면서 전체 구조가 너무 복잡해지고 사용하는 클래스도 많아지는 단점이 생겼다. 실제 이 코드를 구현해야하는 개발자 입장에서 보.. -
Redis를 이용한 토큰 탈취 대응 시나리오(feat. Refresh Token Rotation)
Redis를 이용한 토큰 탈취 대응 시나리오(feat. Refresh Token Rotation)
2023.06.19Redis를 이용한 토큰 탈취 대응 시나리오(feat. Refresh Token Rotation) 문제 상황1. 유효기간이 긴 Refresh Token이 탈취된 경우-> 이 경우는 간단히 Refresh Token Rotation을 떠올릴 수 있다. 하지만 아래의 문제까지 커버가 가능할까?2. 탈취한 Refresh Token으로 정상 유저보다 먼저 Access Token을 재발급 받는 경우-> Refresh Token Rotation을 적용 해도, 정상유저보다 먼저 Refresh Token을 재발급 받으면 어떻게 해야하나?3. 토큰이 탈취된 경우, 한 명의 사용자에 Refresh Token이 여러개 생성되는 경우-> 여러개 생성된 Refresh Token을 가지고 각각 Access Token을 발급받을 수.. -
파이썬 generator와 yield (python generator, yield, yield from)
파이썬 generator와 yield (python generator, yield, yield from)
2023.01.18이번 글에서는 파이썬에서 제너레이터(generator)를 만드는데 사용되는 yield 키워드에 대해서 알아보겠다. yield 키워드 대부분의 프로그래밍 언어에서 일반적으로 함수는 어떤 결과 값을 return 키워드를 이용해서 반환을 한다. 하지만, 파이썬에서는 함수가 yield 키워드를 이용해서 다소 다른 방식으로 결과 값을 제공할 수 있다. 백문이 불여일타다. 간단한 예제 코드부터 살펴보겠다. 알파벳 A, B, C 를 결과 값으로 반환하는 함수를 작성해보겠다. def return_abc(): return list("ABC") 위 함수를 yield 키워드를 이용해서 작성해보자. def yield_abc(): yield "A" yield "B" yield "C" 가장 먼저 눈에 두드러지는 차이는 retur.. -
너 CORS 설정 해줬어? (Cross-Origin Resource Sharing)
너 CORS 설정 해줬어? (Cross-Origin Resource Sharing)
2023.06.22필자는 CORS 개념을 얼핏 들어보기만 했을뿐, 잘 몰랐엇다. 친구가 우연히 한 질문을 이해조차 못하는 나였고, 곧바로 CORS에 대해서 공부했다. 😂 이번 글에서는 CORS 개념을 이해하고 정리한다. CORS (Cross-Origin Resource Sharing)정의우선, 위키피디아에 CROS를 검색해보았다.CORS는, 웹 페이지 상의 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있도록 허용하는 메커니즘이다. 하지만, cross-domain 간의 요청은 기본적으로 Same-Origin Security Policy 에 의해 기본적으로 금지된다.(CORS를 지키면 SOP를 위반하더라도 예외적으로 공유가 가능 하다는 것.)쉽게 이야기하자면, 웹 생태계에는 다른 출처로의 리소스 .. -
JPA 성능 최적화 (feat. @SequenceGenerator allocationSize)
JPA 성능 최적화 (feat. @SequenceGenerator allocationSize)
2023.04.09JPA 성능 최적화 (feat. @SequenceGenerator allocationSize) JPA의 기본 키 매핑을 들여다 보던 중, SEQUENCE 전략에 대해서 이해한 내용을 정리하려고 한다. Persistence Context에 대한 개념을 충분히 이해하고 있다는 가정하에 정리할 것이다. 우선, 기본키 매핑 전략으로 SEQUENCE를 사용하려면 @SequenceGenerator 를 생성해 주어야 한다. @Sequence의 속성은 아래와 같다. 속성들 중, allocationSize에 집중해보자. 성능 최적화에 사용되는 속성이다. allocationSize의 역할을 이해하려면, 먼저 SEQUECE전략의 기본적인 기본 키 매핑 과정을 이해해야한다. em.persist(member)가 호출 되면, m.. -
Algorithm과 Problem Solving
Algorithm과 Problem Solving
2023.02.25Algorithm과 Problem Solving (feat.이코테) 동일한 기능을 구현함에 있어서 주어진 조건에 따라서 효율적인 로직이 무엇일까를 고민해 보는 과정은, "나 자신과의 싸움의 연속이었다." "이것이 취업을 위한 코딩 테스트다"라는 책을 통해 처음 알고리즘 공부에 입문하게 되었고, 해당 도서의 필자가 추천한 로드맵을 따라 한 걸음씩 정진했다. 시간이 좀 오래 걸렸지만, 책을 완독했고, 이 책에서 제시하는 주요 알고리즘 이론과 실전 문제에 어느 정도 익숙해진듯하다. 그리디 구현 DFS/BFS 정렬(선택, 삽입, 퀵, 계수) 이진 탐색 다이나믹 프로그래밍 최단 경로(다익스트라, 플로이드 워셜) 그래프 이론(신장 트리, 위상 정렬) 이론에 대한 실전문제를 바로바로 풀어보려고 노력했으며, 백준(ht..
New
-
Legacy를 이전할건데, 테스트 코드를 작성하자고?
Legacy를 이전할건데, 테스트 코드를 작성하자고?
2024.08.06제목을 조금 자극적으로 써봤습니다.여러분은 테스트코드란 무엇이라고 생각하시나요?제가 소프트웨어 엔지니어로 일을 시작하고나서, 저에게 가장 큰 깨달음을 준건 "테스트코드" 입니다.대부분의 회사에 그렇듯 제가 재직중인 회사에도 Legacy 프로젝트가 존재합니다.여전히 Core 한 로직들이 Legacy 프로젝트에서 동작중이죠. 최근에 작성된 프로젝트들의 경우에는 테스트코드 커버리지가 꽤 높습니다.하지만, Legacy 프로젝트의 경우 테스트코드 커버리지가 거의 0에 가까웠습니다. Legacy 프로젝트는 코드를 읽고 완전한 로직을 파악하기까지 꽤나 많은 시간이 필요합니다. 코드가 서로 얽혀있고, 모듈화 되지 않았기 때문입니다. 그리고 통합 테스트 도구의 부족으로 FeatureTest, 그리고 UnitTest 조차.. -
너 CORS 설정 해줬어? (Cross-Origin Resource Sharing)
너 CORS 설정 해줬어? (Cross-Origin Resource Sharing)
2023.06.22필자는 CORS 개념을 얼핏 들어보기만 했을뿐, 잘 몰랐엇다. 친구가 우연히 한 질문을 이해조차 못하는 나였고, 곧바로 CORS에 대해서 공부했다. 😂 이번 글에서는 CORS 개념을 이해하고 정리한다. CORS (Cross-Origin Resource Sharing)정의우선, 위키피디아에 CROS를 검색해보았다.CORS는, 웹 페이지 상의 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있도록 허용하는 메커니즘이다. 하지만, cross-domain 간의 요청은 기본적으로 Same-Origin Security Policy 에 의해 기본적으로 금지된다.(CORS를 지키면 SOP를 위반하더라도 예외적으로 공유가 가능 하다는 것.)쉽게 이야기하자면, 웹 생태계에는 다른 출처로의 리소스 .. -
Redis를 이용한 토큰 탈취 대응 시나리오(feat. Refresh Token Rotation)
Redis를 이용한 토큰 탈취 대응 시나리오(feat. Refresh Token Rotation)
2023.06.19Redis를 이용한 토큰 탈취 대응 시나리오(feat. Refresh Token Rotation) 문제 상황1. 유효기간이 긴 Refresh Token이 탈취된 경우-> 이 경우는 간단히 Refresh Token Rotation을 떠올릴 수 있다. 하지만 아래의 문제까지 커버가 가능할까?2. 탈취한 Refresh Token으로 정상 유저보다 먼저 Access Token을 재발급 받는 경우-> Refresh Token Rotation을 적용 해도, 정상유저보다 먼저 Refresh Token을 재발급 받으면 어떻게 해야하나?3. 토큰이 탈취된 경우, 한 명의 사용자에 Refresh Token이 여러개 생성되는 경우-> 여러개 생성된 Refresh Token을 가지고 각각 Access Token을 발급받을 수.. -
Redis를 사용하는 이유 (feat. Refresh Token)
Redis를 사용하는 이유 (feat. Refresh Token)
2023.06.18왜 Redis를 사용하는가? Redis는 key-value 쌍으로 데이터를 관리할 수 있는 데이터 스토리지이다. 데이터베이스라고 표현하지 않은 이유는 기본적으로 Redis는 In-Memory 로 데이터를 관리하므로, 저장된 데이터가 영속적이지 않기 때문이다. Redis는 Remote Dictionary Server의 약자로 키(Key) - 값(Value) 쌍의 해시 맵과 같은 구조를 가진 비관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)이다. 데이터가 HDD나 SDD가 아니라 RAM에 저장되어지기 때문에 데이터를 영구적으로 저장할 수 없는 대신, 굉장히 빠른 액세스 속도를 보장받을 수 있다. 빠른 액세스 속도와 휘발성 이라는 특징으로 보통 캐시의 용도로 Redis를 사용한다. Refresh Tok.. -
Access Token의 문제점과 Refresh Token
Access Token의 문제점과 Refresh Token
2023.06.17Access Token의 문제점 사용자의 잦은 로그아웃 경험 다음과 같이 가정하자. A라는 서비스가 있다. A라는 서비스에서는 Refresh Token을 사용중이지 않다. Access Token만을 사용하여 사용자를 인증/인가 한다. A서비스의 Access Token 유효기한은 24시간, 즉 하루다. 로그인을 한 이후 하루가 지나면, A 서비스의 사용자는 A 서비스에서 로그아웃 되는 경험을 하게 될 것이다. 그렇다고 Access Token의 유효 기간을 길게 하자니, 바로 뒤에 이야기할 보안 문제가 발생한다. 보안 문제 사실 Refresh Token을 사용하는 가장 큰 이유가 아닐까 싶다. JWT 직접 만들어보며 이해하기 와 세션 기반 인증과 토큰 기반 인증(feat. Authentication 과 Au.. -
다중 서버 환경에서의 세션 불일치 문제와 해결 방법
다중 서버 환경에서의 세션 불일치 문제와 해결 방법
2023.06.16다중 서버 환경에서의 세션 불일치 문제와 해결 방법 세션 불일치 문제는 단일 서버 환경에서는 발생하지 않으므로 따로 걱정하지 않아도 된다. 하지만, 최근 웹 서비스는 대부분 수직 확장(Scale Up)이 아닌 수평 확장(Scale out) 으로 서버를 확장하기 때문에 일반적으로 다중 서버 환경일 것 이다. 이런 다중 서버 환경에서는 세션 불일치 문제가 발생할 수 있다. 기본적으로 세션은 서버의 메모리(RAM)에 저장되기 때문이다. 예를 들어, 우리가 서버를 수평적으로 확장하기 위해 A, B, C 총 3대의 서버를 설치했다고 가정하자. 이때, 로드 밸런서는 유저의 요청이 들어올 때 마다 A -> B -> C -> A ... 순서대로 요청을 분산 한다고 가정하자.(이를 라운드로빈 방식이라고 한다.) 가운데 ..