회고록

  • #1 [2015-2017] 고등학교 회고록

    #1 [2015-2017] 고등학교 회고록

    고등학교 시절동안 진행한 팀 프로젝트들 입니다. 1. 처음 제작해본 게임 (콩굴러가유) 처음 제작하였던 타이쿤형 게임입니다. CoCos-2dx 엔진을 사용하여 개발하였고, 고등학교 1학년때 개발하여서 클래스도 제대로 못 썼던 모든 부분에서 미숙했던 게임입니다. 타이쿤 게임으로 전체적으로 제작을 맡았으며, 데이터 저장방법에 대해 공부하고 레벨시스템과 객체 구조 설계, 오프라인 보상지급 모델등을 공부하는 과정이 되었습니다. 2. 첫 수상작 (TURN PANEL - 교내 대회 동상) 24시간동안 게임을 만드는 교내 대회에서 나가 처음으로 수상실적을 얻게 된 게임입니다. 24시간뿐이라 퀄리티가 높지는 않지만 특징을 잘 살린 게임이라고 생각합니다. 마찬가지로 CoCos-2dx엔진을 이용하였으며, 하루동안 만든 작..

  • #2 [2018-2020.01] 대학 회고록

    #2 [2018-2020.01] 대학 회고록

    1. 대학 입학 2017년에 수시지원을 하여 국민대 소프트웨어공학과, 숭실대 컴퓨터공학과, 인하대 컴퓨터공학과에 최초합하여 최종적으로 인하대에 진학하였습니다! 2. 인하대학교 컴퓨터공학과 학생회 CSESC 인하대학교 컴퓨터공학과 학생회 홍보편집부에 들어가 많은 과 행사에 대한 회의와 홍보, 일일호프와 같은 과 행사에 참여했습니다. 처음에는 학생회라고 하여 일도 많고 바쁠 줄 알았지만, 생각보다 여유롭고 재밌는 행사가 많았습니다. 3. 과 수석 운이 따랐는지 첫 학기 학점이 4.5가 아님에도 과 수석이 되어 다음 학기에 전액 장학금을 받았습니다. 처음 받아보는 장학금이라 좋았습니다. 4. Challenge The Programming CTP 2학기에는 알고리즘 소모임에 들어가 선배분들께 고급 알고리즘을 배..

  • #3 [2020.04-2022] 대학 회고록2

    #3 [2020.04-2022] 대학 회고록2

    1. 공군 정보보호병 전역 [2020.04.06. ~ 2022.01.05.] 공군에 입대하여 21개월간의 군생활을 정보보호병으로 마쳤습니다. 특기학교에서 리눅스 명령어, html, db..? 등을 배웠는데 군생활하는 도중에는 크게 쓰이지 않았고, 방화벽을 만지는 일이나 상황대응하는 것이 일의 대부분이였습니다. 복무를 하면서 후에도 도움이 된 것은 이메일 작성 예절과 방화벽을 만졌던 경험(aws를 할 때 도움)이고, 공군 자체가 여유가 많다보니 공부를 많이 할 수 있어서 좋았던 것 같습니다. ▼ 관련글 더보기 공군 정보보호병 면접 질문 및 후기 면접 질문에 앞서 [2020.02.06] 공군 정보보호병 면접에 다녀왔습니다. 면접장소는 계룡대 제1정문이였는데 택시가 빙빙돌아서 제2정문에 내려줘서(^^;) 군인..

Review

Recent Posts

  • 블라인드 스터디 : 분산 이메일 시스템 설계

    블라인드 스터디 : 분산 이메일 시스템 설계

    [8장] 분산 이메일 시스템 설계 인터넷의 성장으로 이메일의 양이 늘어나고 활성 사용자도 크게 늘어 이메일 시스템에도 변화가 필요했다 복잡성과 규모 면에서 크게 달라졌으며, 다양한 기능을 갖추게 되었다 1단계 : 문제 이해 및 설계 범위 확정 해당 시스템에는 10억 명의 사용자가 있으며 인증은 따로 존재하지 않는다 사람당 하루에 평균 발신 이메일이 10건, 수신은 40건, 메타데이터는 50KB이라고 가정한다 첨부파일을 포함하는 이메일은 전체의 20%라고 가정하며 크기는 500KB이라고 가정한다 기능 요구사항 - 이메일 수신/발신 - 읽음 여부에 따른 이메일 필터링 - 제목, 발신인, 메일 내용에 따른 검색 - 스팸 및 바이러스 방지 기능 - HTTP를 사용한 연결 - 첨부파일 지원 비기능 요구사항 - 안..

  • 블라인드 스터디 : 호텔 예약 시스템 설계

    블라인드 스터디 : 호텔 예약 시스템 설계

    [7장] 호텔 예약 시스템 들어가면서 대규모 사용자가 접근하는 시스템에서 한정 요소에 대해 판매를 하는 시스템은 서버 시스템 설계 질문에서 자주 나오는 문제이다 동시성 문제는 당연히 있을 것이고, 특정 시간 내에 판매가 이루어진다면 급증하는 트래픽에 대한 방어책도 있어야한다 면접에서 실제로 질문 받았던 경험이 있고, 그때의 대답을 비교하면서 공부를 하였다 예약 시스템은 시스템을 사업에 어떻게 이용할 지에 따라 달라지므로, 질문을 던져 범위를 명확히 할 필요가 있다 1단계 : 문제 이해 및 설계 범위 확정 기능 요구사항 시스템 규모는? - 5000개 호텔에 100만개 객실을 갖춘 호텔 체인을 위한 웹사이트 구축 대금은 예약 시 지불? 체크인 시 지불? - 예약할 때 지불 웹 사이트로만 예약이 가능한지? 아..

  • 블라인드 스터디 : 광고 클릭 이벤트 집계 시스템 설계

    블라인드 스터디 : 광고 클릭 이벤트 집계 시스템 설계

    [6장] 광고 클릭 이벤트 집계 여러 플랫폼은 BM으로 광고 클릭 이벤트를 선택하고 있고, 전체 광고 매출에서 차지하는 비중은 커지고 있다 대규모 규모에 걸맞는 광고 클릭 이벤트에 대해 설계해 보겠다 온라인 광고의 핵심적 혜택은 실시간 데이터를 통해 광고 효과를 정량적으로 측정할 수 있어 실시간 경매(Real-Time Bidding, 이하 RTB)라 부른다 이 경매 절차를 통해 광고가 나갈 인벤토리를 거래한다 광고가 나갈 인벤토리를 경매하면, 광고 거래소에서 해당 인벤토리를 제공하고 광고주가 경매를 하게된다 이 프로세스에서 속도가 중요하고, 데이터의 정확성 또한 중요하다 해당 집계는 온라인 광고가 얼마나 효율적이었는지 측정하는데 결정적인 역할을 하며, 광고주가 얼마나 많은 돈을 지불할지에 영향을 준다 핵..

  • 블라인드 스터디 : 지표 모니터링 및 경보 시스템 설계

    블라인드 스터디 : 지표 모니터링 및 경보 시스템 설계

    [5장] 지표 모니터링 및 경보 시스템 지표 모니터링 및 경보 시스템의 목적 지표 모니터링 및 경보 시스템은 인프라의 상태를 선명하게 볼 수 있고, 높은 가용성과 안정성을 달성하는데 중추적 역할을 한다 널리 쓰이는 서비스로는 DATADOG, Granfana, Prometheus, Munin, graphite 등이 있다 1단계 : 문제 이해 및 설계 범위 확정 지표 모니터링 및 경보 시스템의 범위는 회사마다 다르므로 상의하여 정확한 요구사항을 알아내는 것이 중요하다 인프라 지표에 맞춘 서비스일 수도, 에러 로그와 액세스 로그에 초점을 맞춘 시스템일 수도 있기 때문이다 고려할 사항으로는 - 시스템의 고객이 누구인가? (시스템 운영 지표 수집, CPU부하, 메모리 사용률, 디스크 사용량, TPS, RPS, 프..

  • 블라인드 스터디 : 분산 메시지 큐 시스템 설계

    블라인드 스터디 : 분산 메시지 큐 시스템 설계

    스터디에 들어가기 전 이번에 시스템 설계 면접 사례를 겪게 되고, 테크 컨퍼런스를 찾아보다보니 현 회사에서 겪어보지 못하는, 혹은 직접 개발에 관여하지 않는 대규모 시스템 설계에 대해 더 공부하면 좋겠다 생각이 들어 세 번째 블라인드 구성원들과 함께 하는 스터디로 가상 면접 사례로 배우는 대규모 시스템 설계 기초 2를 시작하였습니다. 8주간 총 13장 중 구성원들이 가장 관심 있어하는 8장에 대해서 진행하려고 하고, 제 기준으로는 가볍지 않은 내용이기 때문에 주마다 한 장씩 공부하면서 블로그에 정리하는 시간을 가져보려고 합니다. 요즘 많이 안 적기도 했고.. [4장] 분산 메시지 큐 분산 메시지 큐를 사용하는 목적 1. 결합도 완화 : 컴포넌트 사이의 강한 결합을 제거하여 독립적으로 갱신 2. 규모 확장..

  • 블라인드 스터디 : Vladimir Khorikov - Unit Testing

    블라인드 스터디 : Vladimir Khorikov - Unit Testing

    블라인드에서 스터디원들과 두번째 스터디는 이전 글에 썼던 것 처럼 Unit Testing에 대해 공부했다. 책을 선정한 이유는 리팩터링과 함께 코드 유지 보수에 좋은 습관을 기를 수 있을 것이라 생각하였고 C#으로 쓰인 책이긴 했지만 유니티를 했었어서 이해할 수 있을 거라고 생각했다. 이전과 마찬가지로 한 주에 5~60페이지 씩 진행하여 8주 정도 진행했고 책을 다 읽은지는 한 달정도 됐으나 일이 바빠서.. 이제 쓰게 됐다. 인프런을 따라가다 보면 작성하는 간단한 테스트 기법을 배우는 것을 떠나 좋은 테스트에 대한 기준과 mock, spy 등을 사용하여 테스트 하는 기법, 테스트를 위한 설계 방법, 통합 테스트 설계 등을 배울 수 있었다 또한 마지막 장의 안티 테스트 패턴을 재밌게 보았는데, 한 번씩 의..

  • [과제] 우아한 테크캠프(백엔드) 6기 2차 과제 테스트 후기

    [과제] 우아한 테크캠프(백엔드) 6기 2차 과제 테스트 후기

    후기 2023.05.13 13:00 ~ 17:00 과제 테스트는 처음이였는데 생각보다 어려운 수준의 과제를 요구하였다. 시간은 4시간인데 API를 21가지? 정도 개발하라는 것이였는데 사실 주요 기능은 4~5가지 정도였다. 명세서와 기본 코드, 테스트 코드만 주어지고, 로그인부터 주요 기능까지 만들어야 하는데 Spring의 인터셉터나 로그인 만료,, 이외 다양한 기능들을 해야하는 것이 나왔다. init data.sql이 있는지 모르는 상태로 진행해서 그 부분 때문에 마지막에 좀 꼬였으나 8~90%정도 기능을 완성해서 제출하였고 통과하였다. 오픈채팅방에서 물어보니 로그인까지만 완성한 사람도 통과했다는 말이 있어서 별로 가중치가 높은 테스트는 아니였나 싶었고, 그 후에 저 링크를 들어가보니 자소서는 4문항에..

  • 블라인드 스터디 : 마틴파울러 - 리팩터링 2판

    블라인드 스터디 : 마틴파울러 - 리팩터링 2판

    블라인드에서 스터디원들을 구해 2달에 한 권정도 공부를 하는 스터디를 진행하였다. 첫번째 책은 좋은 코딩 습관을 기를 수 있는 마틴파울러의 리팩터링 2판 이다. 책을 선정한 이유는 지금까지는 어떠한 기능의 완성만을 위한 개발을 했다면, 이제는 추후의 개발을 위한 미래 지향적인 개발을 하기 위해서였다. 일주일에 한번씩 구글Meet으로 스터디에 대해 이야기하는 시간을 가졌고, 모두 직장인이였기 때문에 부담되지 않게 일주일에 5~60 페이지씩 진행하여 공부한 내용을 공유하였다. 나는 공부한 내용을 노션에 정리하였고, 리팩터링 2판 정리 01 리팩터링 : 첫번째 이야기 mumomu.notion.site 책에 나오는 실습 내용을 JavaScript에서 Java로 변경하여 스터디원들에게 공유하였다 리팩터링이 거의 ..

  • [알고리즘] 우아한 테크캠프(백엔드) 6기 1차 코딩 테스트 후기

    [알고리즘] 우아한 테크캠프(백엔드) 6기 1차 코딩 테스트 후기

    후기 2023.05.06 13:00 ~ 16:00 취업을 하고나서 코딩 테스트(알고리즘) 공부를 안 한지 6개월이 넘었다. 그래서 감도 잃지 않고자 그리고 그동안 C++로만 준비를 했었기 때문에 Java로 코딩 테스트도 체험 해보고자 응시하였다. 과제 테스트도 궁금하기도 했고 사람일은 모르기 때문에 미리 준비해두었다 ㅎ.. 코딩 테스트는 프로그래머스에서 총 3시간으로 4문제가 출제되었고, 백엔드 코스답게 Java로만 응시할 수 있었다 Java로는 코딩 테스트를 준비해본 적이 없어서 처음 참여해보는 것이였다 다행히 프로그래머스라서 입출력은 따로 요구하지 않고 함수에 매개변수와 값 반환을 통해 문제를 풀이하면 되어서 입출력을 찾아보지 않아도 되어 좋았다 난이도는 브론즈~골드하위권 정도 되는 문제들이 출제되었..

  • Redis와 캐시

    Redis와 캐시

    Redis란 Remote Dictionary Server의 준말로 Remote에 위치하고 프로세스로 존재하는 인 메모리 기반의 NoSQL DB로 Key-Value 구조인 데이터 관리 시스템이다. 비 관계형 데이터를 저장하기에 적합하고 쿼리 연산을 지원하지 않지만, 관계형 데이터베이스보다 빠른 읽기와 쓰기에 용이하다. 문자열, 리스트, 해시, 집합, 정렬된 집합 등의 데이터 구조를 지원하며 대규모 분산 시스템에서 많이 사용된다. 데이터베이스의 캐시, 메시징 시스템, 세션 저장소, 분산 락 관리, 게임 서버 등 여러 분야에서 사용된다. 자주 사용되는 곳 - 인증 토큰 등을 저장 - Ranking 보드로 사용 - 유저 API Limit - Job Queue 캐시 한 번 조회된 데이터를 미리 특정 공간에 저장해..

  • Netty와 Spring Webflux

    Netty와 Spring Webflux

    Netty란비동기 이벤트 기반 네트워크 응용프로그램 프레임워크이다. 단순히 네트워크 통신과 관련된 기능 뿐만이 아니라 여러 네트워크 어플리케이션에서의 기능도 제공하고 있어 서버 개발자들이 자신의 비즈니스 로직에 더 집중할 수 있도록 할 수 있다. Netty 프레임워크의 특징비동기 입출력 Netty 프레임워크는 비동기 처리를 지향한다. 요청을 보낸 뒤 즉시 반환한 다음 다른 작업을 하다 요청한 작업의 처리가 완료되면 나중에 응답 받는 방식이다. 보낸 요청의 응답이 올 때까지 기다리는 동기와 상반된 방식 Blocking & Non Blocking Socketread, write, accept 등의 메서드가 호출되면 완료될 떄까지 쓰레드가 멈추는 블로킹 방식과 하나의 스레드로 여러 클라이언트를 대응하는 논 블..

  • Spring AOP 프록시 패턴

    Spring AOP 프록시 패턴

    AOP란 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이다. OOP를 보완하는 것으로 여러 곳에서 자주 사용되는 공통 기능을 모듈화하여 쓰이는 곳에 필요할 때 연결해 유지보수와 재사용성을 용이하도록 프로그래밍 하는 것 AOP를 적용하는 방법 컴파일 타임 적용 : 컴파일 시점 바이트 코드 조작 로드 타임 적용 : 클래스 로딩 시점 런타임 적용 : 스프링 AOP 채택, Bean을 만들 때 Proxy Bean을 만들어 Proxy Bean이 Aspect 코드를 추가하여 동작하는 방법 스프링 빈이란? Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부른다. 제어의 역전으로 인해 프레임워크가 객체를 주입을 맡게 되면서, 주입할 객체를 관리해야하는데 이를 빈이..

  • TCP/IP Socket vs RESTful API vs gRPC vs WebSocket

    TCP/IP Socket vs RESTful API vs gRPC vs WebSocket

    들어가면서 서버에서 클라이언트 혹은 다른 서버와 통신하는 방법으로 여러가지가 있지만 그 중에서 TCP 상에서 IPC를 위해 자주 사용되는 TCP/IP Socket, RESTful API, gRPC, WebSocket의 차이를 공부하고자 한다 프로세스는 기본적으로 상호독립적으로 가동되기 때문에 서로 메모리를 공유하지 않고, 서로 간섭하지 않는다. 그렇기 때문에 프로세스간의 정보교환이 이루어져야 할 때의 방법 중 하나가 IPC이다. 서버는 각 클라이언트와 일대일 혹은 일대다의 관계를 가지며 일대일의 경우 Request/Response, Notification이 통신에 사용되며, 일대다의 경우 Publish/Subscribe 구조를 가지게 된다. (다른 경우도 있지 않을까?) TCP/IP Socket TCP/..

  • 벌크 연산과 @Modifying 어노테이션

    벌크 연산과 @Modifying 어노테이션

    요약 JPA를 이용하게 되어도 쿼리를 작성해야하는 순간이 오는데 다중 write 연산인 Bulk 연산과 @Modifying 어노테이션에 대해서 정리하였다. JPA는 영속성 컨텍스트에 오브젝트를 캐싱하는데 이때 @Modifying 설정에 따라 캐싱된 데이터와 DB의 데이터가 일관하지 않을 수 있다. 이를 고려하여 코드를 작성하여야 한다. @Modifying @Query 어노테이션(JPQL Query, Native Query)을 통해 작성된 insert, update, delete 쿼리에서 사용되는 어노테이션 기본적으로 JpaRepository에서 제공하는 메서드 혹은 메서드 네이밍으로 만들어진 쿼리에는 적용되지 않는다 clearAutomatically, flushAutomactically 속성 변경 가능 ..

  • 비관적 락, 낙관적 락

    비관적 락, 낙관적 락

    Lock이란 DB 충돌 상황을 개선하기 위해 사용하는 것 방법 테이블의 row에 접근 시 lock을 걸고 다른 lock이 걸려 있지 않는 경우에만 수정이 가능하도록 설정 수정할 때 내가 먼저 이 값을 수정했다고 명시하여 다른 사람이 동일한 조건으로 값을 수정할 수 없게 하는 것 낙관적 락(Optimistic Lock) 이론 수정할 때 내가 이 값을 수정했다고 명시하여 다른 사람이 동일한 조건으로 값을 수정할 수 없게 하는 것 (주로 versioning) DB에서 제공하는 것이 아닌 어플리케이션 레벨에서 잡아주는 Lock 애시당초 버전을 동시에 select query에 사용하기 때문에 해당 row가 update된 경우 찾을 수 없음 hashcode와 timestamp를 이용하기도 한다 비관적 락(Pessi..

  • [해커톤] 2022 인하대학교 컴퓨터공학과 해커톤 은상 수상 후기

    [해커톤] 2022 인하대학교 컴퓨터공학과 해커톤 은상 수상 후기

    2022.12.18 19:00 2022년도 인하대학교가 소프트웨어융합대학이 되면서 하계에는 아이디어톤, 동계에는 해커톤이 진행되었다. 아이디어톤과 마찬가지로 재학생 신분이면 지원할 수 있었고, 총 8~9팀 정도가 신청하였다. 팀은 최소 3인이였기도 했고, 상장 및 상금 지급이 늦어 글을 늦게 작성하게 됐지만 이때 당시에는 ssg 인턴만 붙고 넷마블은 붙지 않은 상황이였기 때문에 해커톤을 준비했고, 블록체인을 하는 친구들과 블록체인 프로젝트를 해보면 어떨까~ 해서 팀을 꾸렸다. 팀원은 백엔드 및 팀장(나), 그리고 블록체인 및 프론트엔드 개발자 2명, ios 개발자 1명으로 구성하였다. 다른 해커톤을 많이 참가해봤지만 이번 해커톤은 13시간동안 만드는 것으로 매우 짧았다. 주제를 당일 알려주어 프로젝트를 ..

  • Spring protobuf 부분 로딩 오류 해결(GCP Storage Signed Url)

    Spring protobuf 부분 로딩 오류 해결(GCP Storage Signed Url)

    서버에서 클라이언트로 사진, 음원, 영상을 보내야하는 작업이 있었다. 영상을 서버에 저장해서 클라이언트로 보내는 것은 서버에 큰 부하가 있기 때문에 GCP Storage에 영상을 저장하고 해당 링크를 클라이언트로 보내주기로 했다. Storage를 사용하면 영구히 변하지 않는 PublicUrl을 제공하는 방법과 만료 시간을 정할 수 있는 SignedUrl을 제공하는 방법이 있다. PublicUrl이 주어지면 이를 클라이언트 단에서 탈취해 부적절한 접근을 할 수 있으므로 SignedUrl을 사용하기로 했다. 송신하는 응답 패킷에는 SignedUrl을 사용하는 필드가 3개 있었는데, SignedUrl로 변경하자마자 클라이언트단에서 데이터 중 일부를 받지 못하는 상황이 발생했다. 패킷이라면 일부가 전송이 실패하..

  • SpringBoot JUnit5 테스트 및 어노테이션

    SpringBoot JUnit5 테스트 및 어노테이션

    SpringBoot의 테스트 종류 @SpringBootTest 실제 어플리케이션을 자신의 로컬 위로 올려서 포트 주소가 Listening 되어지고, DB와 커넥션이 붙어지는 상태로 진행되는 라이브 테스트 방법 Bean 범위 : 주입된 Bean 전체 다른 테스트에 비해 무거운 테스트 @WebMvcTest Controller(API) Layer만을 테스트하기 적합한 테스트 어노테이션으로, 전체 어플리케이션을 실행하는 것이 아닌 Controller만을 로드하여 테스트를 진행할 수 있는 테스트 방법 Bean 범위 : MVC관련 Bean(Controller, Service) @DataJpaTest Jpa DB I/O 테스트 Bean 범위 : JPA 관련 Bean(EntityManager) @RestClientTe..

  • Protobuf(Protocol Buffers)와 RPC

    Protobuf(Protocol Buffers)와 RPC

    들어가면서 게임에서는 문자열을 모두 원본 형태로 보내는 JSON 방식이 아닌 더욱 적은 대역폭으로 전송을 하는 Protobuf를 사용하기도 한다. 이를 실무에서 사용하기 전에 공부해보고자 Protobuf와 RPC에 대한 글을 정리하였다. RPC 통신 RPC 통신이란 Remote Procedure Call(원격 프로시저 호출)의 준말로, 별도의 원격제어 코드 없이 다른 주소 공간에서 함수/프로시저를 실행하도록 하는 프로세스 간 통신 기술(어디든 동일 호출) 함수 input에 따른 output의 발생 return값을 필요로 하며, 간단한 계산 및 수치 등을 도출할 때 사용 프로시저 output 값에 집중보단, 명령 단위 수행절차에 집중 return은 없을 수도 있고, 서버단에서 함수보다 큰 실행, 프로세싱 ..

  • GraalVM 소개

    GraalVM 소개

    GraalVM이란 GraalVM은 Java 코드를 작성하고 실행할 수 있는 도구 - 더 빠르고 유지하기 쉬운 컴파일러 작성 ex)트위터 : Scala 코드의 성능 향상 - JVM에서 실행되는 언어의 성능 향상 - 애플리케이션 시작 시간 단축 - Java 에코 시스템에 다국어 지원 통합 구성요소 - 고성능 최적화 Just-In-Time 컴파일러 : JVM 기반 어플리케이션을 기본적으로 실행 가능한 바이너리로 컴파일하는데 사용 - 네이티브 실행 파일을 빌드하기 위한 Ahead-of-Time 컴파일러 - 다국어 지원 : 프로그래밍 언어 인터프리터를 제공, 이를 이용해 GraalVM을 확장하여 Java 에코 시스템에 언어 추가 Just-In-Time(JIT) 컴파일러란 - 프로그램을 실제 실행하는 시점에 기계어..