Hi 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 ....
https://www.acmicpc.net/problem/25682 문제 접근 첫 번째 단계 문제의 조건은 다음과 같다. M * N 크기의 보드가 있는데, 어떤 정사각형은 검은색으로 칠해져있고, 나머지는 휜색으로 칠해져있음. 이 보드를 잘라서 K * K 크기의 체스판으로 만들려고함. 정상적인 체스판은 검은색과 휜색이 번갈아서 칠해져 있어야 함. 구체적으로, 각 칸이 검은색과 휜색 중 하나로 칠해져 있으면서, 변을 공유하는 두개의 사각형은 다른 색으로 칠해져 있어야 함. 이 정의를 따르면, 체스판을 색칠하는 경우는 두 가지 뿐이다. 1. 맨 왼쪽 위 칸이 휜색인 경우, 2. 맨 왼쪽 위 칸이 검은색인 경우 보드가 체스판 처럼 칠해져 있다는 보장이 없어서, M * N 크기의 보드를 K * K 로 자른 후, ..
OpenSea를 통해 NFT에 대해 좀더 공부해보며 느낀점을 기록하려고 한다.우선, 나는 꽤 오래 전부터 블록체인, NFT등에 관심이 있었다.그러한 관심은 내가 좀더 NFT를 알아감에 있어서 부정적인 시선으로 바뀌어 가고 있었다.왜냐하면, NFT가 사용되는 세계인 "메타버스"라는 단어자체는, 가상세계와 다를바가 없어보였기 때문이다.해당 워딩은, "메타버스"라는 섹터를 만들어서 사람들의(투자자) 관심을 유도한 후, 주가 띄우기에 활용되는 것 뿐 이라는 생각이 들었다."메타버스" 또는 "NFT"라는 워딩을 언급한 기업의 주가는 상상이상으로 높게 치솟았고, "메타버스"와 직접적으로 관련이 있는 각종 게임주들, 그리고 엔터주들의 주가또한 엄청난 상승을 보여주었다.결국 "메타버스"와 "NFT"는 닷컴버블처럼 또다..
JPA 성능 최적화 (feat. @SequenceGenerator allocationSize)
2023.04.09
JPA 성능 최적화 (feat. @SequenceGenerator allocationSize) JPA의 기본 키 매핑을 들여다 보던 중, SEQUENCE 전략에 대해서 이해한 내용을 정리하려고 한다. Persistence Context에 대한 개념을 충분히 이해하고 있다는 가정하에 정리할 것이다. 우선, 기본키 매핑 전략으로 SEQUENCE를 사용하려면 @SequenceGenerator 를 생성해 주어야 한다. @Sequence의 속성은 아래와 같다. 속성들 중, allocationSize에 집중해보자. 성능 최적화에 사용되는 속성이다. allocationSize의 역할을 이해하려면, 먼저 SEQUECE전략의 기본적인 기본 키 매핑 과정을 이해해야한다. em.persist(member)가 호출 되면, m..
https://www.acmicpc.net/problem/9370 문제 분석 첫 번째 단계(문제 요약 및 조건 파악하기) 처음에, 이 문제를 읽고, 한번에 머리에 안들어와서 당황했다. 입력도 은근히 많았고 말이다. 호흡을 가다듬고, 다시한번 집중해서 읽으면서 중요한 부분을 요약했다. 이해하고나니, 별거 아니었다. 정리하자면, s 지점에서 출발하고, 목적지 후보들이 있고, 목적지에는 최단 거리로 가야한다. 경로와 관련된 조건이 있는데, g와 h 교차로 사이에 있는 도로를 무조건 지나가는 경로여야 한다. 목적지 후보들 중, 목적지로 불가능한 경우를 제외하고, 다른 목적지들을 공백으로 분리시켜 오름차순의 정수로 출력해야 하는 문제다. 입력을 풀어서 정리하면 아래와 같다. 테스트케이스 개수 n(교차로), m(도..
제목을 조금 자극적으로 써봤습니다.여러분은 테스트코드란 무엇이라고 생각하시나요?제가 소프트웨어 엔지니어로 일을 시작하고나서, 저에게 가장 큰 깨달음을 준건 "테스트코드" 입니다.대부분의 회사에 그렇듯 제가 재직중인 회사에도 Legacy 프로젝트가 존재합니다.여전히 Core 한 로직들이 Legacy 프로젝트에서 동작중이죠. 최근에 작성된 프로젝트들의 경우에는 테스트코드 커버리지가 꽤 높습니다.하지만, Legacy 프로젝트의 경우 테스트코드 커버리지가 거의 0에 가까웠습니다. Legacy 프로젝트는 코드를 읽고 완전한 로직을 파악하기까지 꽤나 많은 시간이 필요합니다. 코드가 서로 얽혀있고, 모듈화 되지 않았기 때문입니다. 그리고 통합 테스트 도구의 부족으로 FeatureTest, 그리고 UnitTest 조차..
https://www.acmicpc.net/problem/1904 문제 접근 첫번째 단계 문제의 조건을 정리하면 아래와 같다. 0과 1 타일이 있는데, 0타일은 00 이런식으로 두개씩 사용가능하다. 1타일은 낱개로 사용이 가능하다. N이 주어졌을 때, N크기의 2진수열을 만든다면, 만들 수 있는 수열의 갯수를 구하는 것이다. 예를 들어, n = 1일 때는 1만 단독으로 사용이 가능할 것이다. n = 2 일 때는 00 or 11 이렇게 구성이 가능할 것이다. 이번에는 n = 3일 때를 생각해보자. 세칸이 있는데, 해당 3칸을 1칸과 2칸으로 나누어 생각해본다면, n = 1일때와 n = 2 일때를 포함하고 있는 것을 파악할 수 있다. 1. 큰 문제를 작은 문제로 나눌 수 있다.(최적 부분 구조) n = 3일..
Redis를 이용한 토큰 탈취 대응 시나리오(feat. Refresh Token Rotation)
2023.06.19
Redis를 이용한 토큰 탈취 대응 시나리오(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을 발급받을 수..
https://www.acmicpc.net/problem/1300 1300번: K번째 수 세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B www.acmicpc.net 문제 접근 이 문제에서 주어진 N의 범위는 10^5, K의 범위는 min(10^9, N^2) 이기 때문에, 이분 탐색을 이용해야 할 것으로 예상된다. 이 문제를 간단하게 요약하면, A[i][j] = i*j 이고, 크기는 N*N 2차원 행렬을 1차원 배열 B로 만들 때, B[K]의 값은 무엇인지 구하는 문제이다. (단 인덱스는 1부터 시작한다. 라고 문제에 제시되어있음..
문제 조규현과 백승환은 터렛에 근무하는 직원이다. 하지만 워낙 존재감이 없어서 인구수는 차지하지 않는다. 다음은 조규현과 백승환의 사진이다. 이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다. 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다. 조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때, 류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 이루어져 있다. 한 줄에 x1, y1, r1, x2, y2, r2가 주어진다. x1, ..
목차주제 선정요구 사항참고한 문서DB SchemaProject StructureAPI추가로 공유할 만한 내용마무리 주제 선정사내 노션을 확인하던 중, 도서 관리 문서를 발견했고, 해당 문서를 서비스화 해서 DB 로 도서 대여 히스토리 등을 관리하면 좋겠다는 생각이 들었습니다. 요구사항사내 노션의 도서 관리 문서에 존재하는 피쳐들을 그대로 이관할 수 있도록 구현하는 것을 최우선 순위로 하였습니다.로그인 기능도서 등록(구매 요청)도서 상태도서명도서 분야대여자신청자도서 상태값 변경등의 피쳐들이 존재합니다. 참고한 문서NestJS + Prisma 를 이용하여 Back-end Server 를 구현하였고, 앞으로 주로 사용하게 될, NestJS 와 Prisma 에 대한 정확한 내용을 파악하고자, 공식 문서를 참고..
제목을 조금 자극적으로 써봤습니다.여러분은 테스트코드란 무엇이라고 생각하시나요?제가 소프트웨어 엔지니어로 일을 시작하고나서, 저에게 가장 큰 깨달음을 준건 "테스트코드" 입니다.대부분의 회사에 그렇듯 제가 재직중인 회사에도 Legacy 프로젝트가 존재합니다.여전히 Core 한 로직들이 Legacy 프로젝트에서 동작중이죠. 최근에 작성된 프로젝트들의 경우에는 테스트코드 커버리지가 꽤 높습니다.하지만, Legacy 프로젝트의 경우 테스트코드 커버리지가 거의 0에 가까웠습니다. Legacy 프로젝트는 코드를 읽고 완전한 로직을 파악하기까지 꽤나 많은 시간이 필요합니다. 코드가 서로 얽혀있고, 모듈화 되지 않았기 때문입니다. 그리고 통합 테스트 도구의 부족으로 FeatureTest, 그리고 UnitTest 조차..
필자는 CORS 개념을 얼핏 들어보기만 했을뿐, 잘 몰랐엇다. 친구가 우연히 한 질문을 이해조차 못하는 나였고, 곧바로 CORS에 대해서 공부했다. 😂 이번 글에서는 CORS 개념을 이해하고 정리한다. CORS (Cross-Origin Resource Sharing)정의우선, 위키피디아에 CROS를 검색해보았다.CORS는, 웹 페이지 상의 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있도록 허용하는 메커니즘이다. 하지만, cross-domain 간의 요청은 기본적으로 Same-Origin Security Policy 에 의해 기본적으로 금지된다.(CORS를 지키면 SOP를 위반하더라도 예외적으로 공유가 가능 하다는 것.)쉽게 이야기하자면, 웹 생태계에는 다른 출처로의 리소스 ..
Redis를 이용한 토큰 탈취 대응 시나리오(feat. Refresh Token Rotation)
2023.06.19
Redis를 이용한 토큰 탈취 대응 시나리오(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를 사용하는가? Redis는 key-value 쌍으로 데이터를 관리할 수 있는 데이터 스토리지이다. 데이터베이스라고 표현하지 않은 이유는 기본적으로 Redis는 In-Memory 로 데이터를 관리하므로, 저장된 데이터가 영속적이지 않기 때문이다. Redis는 Remote Dictionary Server의 약자로 키(Key) - 값(Value) 쌍의 해시 맵과 같은 구조를 가진 비관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)이다. 데이터가 HDD나 SDD가 아니라 RAM에 저장되어지기 때문에 데이터를 영구적으로 저장할 수 없는 대신, 굉장히 빠른 액세스 속도를 보장받을 수 있다. 빠른 액세스 속도와 휘발성 이라는 특징으로 보통 캐시의 용도로 Redis를 사용한다. Refresh Tok..
Access Token의 문제점 사용자의 잦은 로그아웃 경험 다음과 같이 가정하자. A라는 서비스가 있다. A라는 서비스에서는 Refresh Token을 사용중이지 않다. Access Token만을 사용하여 사용자를 인증/인가 한다. A서비스의 Access Token 유효기한은 24시간, 즉 하루다. 로그인을 한 이후 하루가 지나면, A 서비스의 사용자는 A 서비스에서 로그아웃 되는 경험을 하게 될 것이다. 그렇다고 Access Token의 유효 기간을 길게 하자니, 바로 뒤에 이야기할 보안 문제가 발생한다. 보안 문제 사실 Refresh Token을 사용하는 가장 큰 이유가 아닐까 싶다. JWT 직접 만들어보며 이해하기 와 세션 기반 인증과 토큰 기반 인증(feat. Authentication 과 Au..
Redis를 이용한 토큰 탈취 대응 시나리오(feat. Refresh Token Rotation)
Redis를 이용한 토큰 탈취 대응 시나리오(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를 사용하는가? Redis는 key-value 쌍으로 데이터를 관리할 수 있는 데이터 스토리지이다. 데이터베이스라고 표현하지 않은 이유는 기본적으로 Redis는 In-Memory 로 데이터를 관리하므로, 저장된 데이터가 영속적이지 않기 때문이다. Redis는 Remote Dictionary Server의 약자로 키(Key) - 값(Value) 쌍의 해시 맵과 같은 구조를 가진 비관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)이다. 데이터가 HDD나 SDD가 아니라 RAM에 저장되어지기 때문에 데이터를 영구적으로 저장할 수 없는 대신, 굉장히 빠른 액세스 속도를 보장받을 수 있다. 빠른 액세스 속도와 휘발성 이라는 특징으로 보통 캐시의 용도로 Redis를 사용한다. Refresh Tok..
Access Token의 문제점 사용자의 잦은 로그아웃 경험 다음과 같이 가정하자. A라는 서비스가 있다. A라는 서비스에서는 Refresh Token을 사용중이지 않다. Access Token만을 사용하여 사용자를 인증/인가 한다. A서비스의 Access Token 유효기한은 24시간, 즉 하루다. 로그인을 한 이후 하루가 지나면, A 서비스의 사용자는 A 서비스에서 로그아웃 되는 경험을 하게 될 것이다. 그렇다고 Access Token의 유효 기간을 길게 하자니, 바로 뒤에 이야기할 보안 문제가 발생한다. 보안 문제 사실 Refresh Token을 사용하는 가장 큰 이유가 아닐까 싶다. JWT 직접 만들어보며 이해하기 와 세션 기반 인증과 토큰 기반 인증(feat. Authentication 과 Au..
다중 서버 환경에서의 세션 불일치 문제와 해결 방법 세션 불일치 문제는 단일 서버 환경에서는 발생하지 않으므로 따로 걱정하지 않아도 된다. 하지만, 최근 웹 서비스는 대부분 수직 확장(Scale Up)이 아닌 수평 확장(Scale out) 으로 서버를 확장하기 때문에 일반적으로 다중 서버 환경일 것 이다. 이런 다중 서버 환경에서는 세션 불일치 문제가 발생할 수 있다. 기본적으로 세션은 서버의 메모리(RAM)에 저장되기 때문이다. 예를 들어, 우리가 서버를 수평적으로 확장하기 위해 A, B, C 총 3대의 서버를 설치했다고 가정하자. 이때, 로드 밸런서는 유저의 요청이 들어올 때 마다 A -> B -> C -> A ... 순서대로 요청을 분산 한다고 가정하자.(이를 라운드로빈 방식이라고 한다.) 가운데 ..
세션 기반 인증과 토큰 기반 인증(feat. Authentication 과 Authorization)
인증과 인가 세션기반 인가와 토큰기반 인가에 대해 알아보기 이전에 먼저, 인증과 인가가 무엇인지 부터 알아야 할 필요가 있다. 인증과 인가를 같거나 비슷한 개념이라고 생각하는 사람들이 많을텐데, 엄밀하게는 서로 다른 개념이다. 인증과 인가는 요약하자면 시스템의 자원을 적절하고 유효한 사용자에게 전달하고 공개하는 방법이다. 인증(Authentication) 인증은 쉽게 말하자면, 로그인 이다. 클라이언트가 자기자신이라고 주장하고 있는 사용자가 맞는지를 검증하는 과정이다. 예를 들어 로그인 화면에서 내가 유저 아이디를 USER1 로 입력하고 패스워드를 입력해 제출하면, 서버에서는 내가 진짜로 USER1 이라는 유저가 맞는지 확인한다. 인가(Authorization) 인가는 인증 작업 이후에 행해지는 작업으로..
HTTP의 Connectionless와 Stateless HTTP는 요청과 응답을 한번 주고받으면 바로 연결을 끊어버리는 특성을 가지고 있다. 그리고 다음 요청을 하기 위해 다시 연결을 맺어야 한다. 이를 HTTP의 Connectionless(비연결성) 라고 한다. 또한 HTTP 프로토콜은 요청과 응답을 교환하는 동안 상태(Status)를 저장하지 않는다. 따라서 HTTP 레벨에서는 이전에 보냈던 request나 response를 기억하지 못한다. 즉, HTTP 요청은 직전의 요청과 전혀 관련이 없다. 이를 HTTP의 Stateless(비상태성) 라고 한다. HTTP가 상태를 갖지 않음으로서 연결을 맺을 때 발생하는 오버헤드가 줄어들고, 데이터를 빠르고 확실하게 처리할 수 있다. 또한 요청간의 상태를 공..
JWT 직접 만들어보며 이해하기 본 포스팅에서는 JWT의 정의, 구조, 원리 등을 알아보며 실습을 통해 '라이브러리 없이' 직접 JWT를 생성하고 해독해본다. 1. JWT에 대하여 1-1. JWT의 정의 Json Web Token의 줄임말이다. RFC 7519 에 명세되어 있는 국제 표준으로써, 통신 양자간의 정보를 JSON 형식을 사용하여 안전하게 전송하기 위한 방법이다. JWT는 정보가 토큰 자체에 포함된 (Self-Contained)클레임(Claim)기반 토큰이다. JWT는 인증(Authentication) 과 권한부여(*인가)(Authorization) 에 사용되는 것이 가장 일반적이다. 인증 절차를 거쳐 서버에서 JWT를 발급해주면, 클라이언트는 이를 잘 보관하고 있다가 API 등을 사용할 때에..
Blocking과 Non-Blocking, Sync와 Async 그만 헷갈리기 OS를 공부하면서 Blocking과 Non-Blocking, Sync와 Async 개념을 이해했었는데, 다시 떠올려보니 너무 헷갈렸다. 특히 둘을 섞어서 생각해보면 더 혼란스러워졌다. 헷갈리는 것을 찾아보다가, 우연히 보게 된 좋은 예시가 있어서 정리해두고자 한다. 사무실에 있다. 복합기를 사용해서 스캔을 뜨고싶다. 그런데 문서의 양이 많아서 시간이 좀 오래걸린다. 10분 이상 걸린다고 가정하자. 복합기의 시작 버튼을 눌렀다. 그리고 그 앞에서 스캔이 완료될 때까지 하염없이 기다렸다가 스캔 된 파일 결과물을 갖게 된다면, 이것은 Blocking 이다. 10분은 아무것도 안하기에는 꽤 긴시가이다. Blocking 방식에는 다른 ..
JPA 성능 최적화 (feat. @SequenceGenerator allocationSize)
JPA 성능 최적화 (feat. @SequenceGenerator allocationSize) JPA의 기본 키 매핑을 들여다 보던 중, SEQUENCE 전략에 대해서 이해한 내용을 정리하려고 한다. Persistence Context에 대한 개념을 충분히 이해하고 있다는 가정하에 정리할 것이다. 우선, 기본키 매핑 전략으로 SEQUENCE를 사용하려면 @SequenceGenerator 를 생성해 주어야 한다. @Sequence의 속성은 아래와 같다. 속성들 중, allocationSize에 집중해보자. 성능 최적화에 사용되는 속성이다. allocationSize의 역할을 이해하려면, 먼저 SEQUECE전략의 기본적인 기본 키 매핑 과정을 이해해야한다. em.persist(member)가 호출 되면, m..
크루스칼 알고리즘 (Kruskal Algorithm) 신장 트리 중에서 최소 비용으로 만들 수 있는 신장 트리를 찾는 알고리즘을 '최소 신장 트리 알고리즘' 이라고 하는데, 대표적인 최소 신장 트리 알고리즘으로는 크루스칼 알고리즘 이 있다. 크루스칼 알고리즘 을 사용하면 가장 적은 비용으로 모든 노드를 연결할 수 있다. 크루스칼 알고리즘은 대표적인 최소 신장 트리 알고리즘 이다. 그리디 알고리즘으로 분류된다. 그렇다면, 신장 트리란 무엇인가? 신장 트리 란 하나의 그래프가 있을 때 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미한다. → 이때 모든 노드가 포함되어 서로 연결되면서 사이클이 존재하지 않는 다는 조건은 트리 의 성립 조건이기도 함. 신장 트리는 알겠고.. 그러면 최소 신장 ..
이번 글에서는 파이썬에서 제너레이터(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..
JAVA를 이용해서 프로그래밍을 하고 있는 사람으로서 JAVA의 간단한 탄생배경과 JAVA의 시작과 끝이라고 할 수 있는 JVM을 한번 짚고 넘어가려고 한다. 목차 1. JAVA 탄생 배경 2. 자바 코드(JAVA Code) 실행 과정 3. JVM 동작원리 및 기본개념 3-1. 클래스 로더 (Class Loader) 3-2. 런타임 데이터 영역(Runtime Data Area) 3-3. 실행 엔진(Execution Engine) JAVA 탄생배경 JAVA는 썬 마이크로시스템즈의 제임스 고슬링이라는 사람과 다른 연구원들이 개발한 프로그래밍 언어이다. 1991년 그린 프로젝트라는 이름으로 시작해 1995년에 발표가 되었다. 처음에는 가전제품 내에 탑재해 동작하는 프로그램을 위해 개발했는데 아이러니하게도 현재..
머신러닝 / 딥러닝 모델을 학습시키기 위해서는 데이터셋이 필요하다. 이 데이터셋은 어떻게 구성하고 활용할까? sickit-learn의 model_selection 패키지 안에는 학습세트와 테스트세트를 분리할 수 있는 모듈이 있다. train_test_split 모듈에 대해서 알아볼 것이다. train, validation, test 데이터셋 머신러닝, 딥러닝 모델을 피팅시키기 위해서는 데이터셋을 크게 세 가지로 분리한다. training set(학습 데이터셋) : 모델의 학습을 위해 사용되는 데이터 validation set(검증 데이터셋) : 모델의 학습 과정에서 성능을 확인하고, 하이퍼 파라미터를 튜닝하는데 사용된다. 여러가지 하이퍼 파라미터로 생성된 모델들 중에 어떤 것이 성능이 좋은지 평가한다. ..
스프링 인터셉터 - 인증 체크 서블릿필터에서 사용했던 인증 체크 기능을 스프링 인터셉터로 개발해보자. LoginCheckInterceptor 서블릿 필터와 비교해서 코드가 매우 간결하다. 인증이라는 것은 컨트롤러 호출 전에만 호출하면 된다. 따라서 preHandle만 구현하면 된다. 순서 주의, 세밀한 설정 가능) 인터셉터와 필터가 중복되지 않도록 필터를 등록하기 위한 logFilter(), loginCheckFilter()의 @Bean은 주석처리하자. 인터셉터를 적용하거나 하지 않을 부분은 addPathPatterns와 excludePathPatterns에 작성하면 된다. 기본적으로 모든 경로에 해당 인터셉터를 적용하되(/**), 홈(/), 회원가입(/members/add), 로그인(/login), 리..
스프링 인터셉터 - 요청 로그 LogInterceptor - 요청 로그 인터셉터 String uuid = UUID.randomUUID().toString() 요청 로그를 구분하기 위한 uuid를 생성한다. request.setAttribute(LOG_ID, uuid) 서블릿 필터의 경우 지역변수로 해결이 가능하지만, 스프링 인터셉터는 호출 시점이 완전히 분리되어 있다. 따라서 preHandle에서 지정한 값을 postHandle, afterCompletion에서 함께 사용하려면 어딘가에 담아두어야 한다. LogInterceptor도 싱글톤 처럼 사용되기 때문에 멤버 변수를 사용하면 위험하다. 따라서 request에 담아두었다. 이 값은 afterCompletion에서 request.getAttribute..
스프링 인터셉터 - 소개 스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다. 서블릿 필터가 서블릿이 제공하는 기술이라면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다. 둘다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다르다. 스프링 인터셉터 흐름 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출 된다. 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다. 스프링 MVC의 시작점이 디스패처 서블릿이라고 생각해보면 이해가 될 것이다. 스프링 인터셉터에도 URL 패턴을 적용할 수 있는데, 서블릿 URL 패턴과는 다르고, 매우 정밀..
컴퓨터 비전이 뭐야? 컴퓨터 비전(computer vision)이라는 단어에서 알 수 있듯, 사람의 시각과 유사한 시스템 구조를 통해 컴퓨터가 사람처럼 물체나 상황을 식별하고 해석할 수 있도록 하는 분야이다. 컴퓨터 비전에서 다루는 데이터는 이미지와 이미지 내부의 텍스트를 인지하는 영역 뿐만 아니라 Video와 3D Video도 포함된다. Video는 image Frame의 합이기 때문이다. 스마트폰이 대중화되면서 image뿐만 아니라 video data가 기하급수적으로 증가했다. 이는 컴퓨터 비전이라는 연구분야의 필요성을 증대시켰다. 한 애널리스트의 발표에 따르면, 2021년 컴퓨터 비전에서 AI 시장 규모는 159억 달러로 추정하였고, 2026년까지 해당 시장은 513억달러에 이를 것으로 예상된다. ..