donghoony


  • 우아한테크코스 수료, 앞으로 나아가기

    우아한테크코스를 수료했다. 이것만 해도 이야기보따리가 넘쳐나지만, 이번 포스팅에서는 따끈따끈한 취업 소식을 들고 왔다. 🏃 레벨 5 이야기 레벨 4가 마무리되고, 레벨 5와 함께 본격적인 취업 활동이 시작되었다. 우테코 측에서 취업 활동을 지원해주는 건 아니지만(우테코에서는 테크코스 과정을 더 중요시하고, 이 과정에서도 수료를 위해 해야하는 과제들이 넘쳐난다. 나 또한 그렇게 생각한다), 하반기 채용 시장이라는 시기와 맞물려있기 때문에 다들 이력서를 하나둘 써나가는 모습을 볼 수 있었다. 테크코스보다 취업이 중요하다면.. 테크코스를 나가는 방법이 있다⋯


  • 《도메인 주도 설계 철저 입문》 DDD, 코드 저 너머로

    🚫 DDD 멈춰 우스갯소리지만 우아한테크코스에서는 DDD 관련 책들을 금서로 여긴다. 책을 꺼내드는 순간 객체 아저씨가 이놈~ 하고 쫓아온다나 뭐라나(자매품으로 토비의 스프링이 있다). 기본적인 언어 습득, 책임 분리도 잘 학습되지 않았는데 이런 디자인을 가져와서 어떻게 쓰겠냐는 이야기다. 레벨 2의 미션에서 아래와 같은 피드백을 받았다. 그땐 ‘이게 뭐길래 그러는 거지?’라는 생각이 스멀스멀 피어올랐지만, 지금은 어느정도 이해가 간다. DDD는… 제 생각엔 이 미션에서 조금(x) 한참(o) 벗어난 주제라고 생각하여 앞서 고민해봤다고 남겼던거였어요. 일단 DDD는⋯


  • 운영체제 흐름 정리: Address Space부터 Paging까지

    옛날에는 많은 추상화를 제공하지 않았다. 또 그럴 필요도 없었다. 메모리 내부 공간을 하나의 프로세스가 차지하는 게 편리하기도 했고, 그 당시에는 실행 파일이 그렇게 크지 않았기 때문이다. 최근들어 프로세스의 양도 많아지고, 용량도 커짐에 따라 이와 같은 방식을 활용하는 데 제약이 생겼다. Multiprogramming, Time sharing하나의 CPU에서 여러 프로세스를 가동함으로써 사용성을 높인다. 사용자에게는 ‘동시에‘ 여러 일을 하는 것처럼 보이게 한다. 가상화의 시작이 되는 순간이다. 이때 문제가 발생할 수 있다. 메모리에서는 다양한 프로세스가 올라가⋯


  • 동시성 제어하기(2): Lock

    이 글은 동시성 제어하기(1): Synchronization에서 이어집니다. 🤘🏻 나락도 락이다. 비관적 락도 락인가? Lock은 락이다(아니다). 🔒 Lock Lock은 동시성을 제어하기 위한 하나의 수단이다. Race condition을 막기 위해 공유된 자원 (Shared resource, Critical section)에 접근하는 스레드를 제한한다. 다만 이러한 과정 속에서 높은 정합성은 유지할 수 있지만, Lock을 획득하기 위해 기다리는 시간이 전체 실행 시간에 포함되므로 연산을 완료할 때까지 오랜 시간이 걸린다. 결국 Lock의 범위를 최소화하는 것이 성능에 큰 영향을 미친다. 이전 Synchronized⋯


  • 동시성 제어하기(1): Synchronization

    🍒 앵두랩 파헤치기 스프링 위에서 동시성을 제어해 보자. 망쵸와 감자가 앵두랩이라는 미션 레포지토리를 만들어 두어서 재미있게 공부했다. 우리는 아래와 같은 문제를 해결해야 한다! 아래와 같은 비즈니스 로직이 빠르고 정확하게 돌아가도록 구현해야 한다. 처음부터 문제를 해결하려고 하면 어려우니, 간단한 상황을 제시하고 하나씩 어려운 단계로 들어가 보자. 우선 단일 서버, 단일 DB 상황을 가정하고 문제를 해결하자. 🪨 데드락도 락이다 (아님) 10개의 티켓을 발급한 뒤 5명의 사람이 동시에 두 개의 티켓을 가져가는 시나리오를⋯


  • 깊은 DTO와 매핑 로직 고민하기

    🪨 그만 괴롭혀요 DTO 몇 달간 백엔드 팀을 괴롭힌 주제가 있다. DTO 매핑과 그 깊이인데, 그 시작은 엔티티 연관관계까지 거슬러 올라간다. 🚀 JPA를 활용한 엔티티 연관관계의 기준을 무엇으로 할 것인가? 에 대한 결론이 어느 정도 수립돼 있었기에, 새로운 도메인이 등장하거나 요구사항이 등장하더라도 어렵지 않게 추가하거나 변경할 수 있었다. 네 명이 다같이 데이고 공감한 부분이 많다보니, 함께 싱크를 맞춰나가는 것도 어렵지 않았다 🙂 리뷰미의 코드는 크게 ReviewGroup, Review, Template, Highlight 네⋯


  • JdbcTemplate에서는 왜 Optional을 반환하지 않을까? (JdbcClient의 탄생)

    JdbcTemplate을 직접 구현하는 미션 덕에 이것저것 공부하던 도중, 다른 크루의 미션 제출 현황을 보고 궁금한 게 생겼다. 우선 옵셔널이 무엇인지는 조이썬의 테코톡을 한 번 보고 오자 🤙🏻, Optional이 등장하게 된 배경과 주의할 점을 잘 설명해 주었다! 희선이 최고 🙌🏻 📦 Optional Java 8과 함께 등장한 Optional. 값을 감싸는 Wrapper class의 역할을 한다. 추가적인 클래스이므로 orElse(), orElseGet()와 같은 편의 메서드 또한 제공한다. 존재 여부를 null로 처리하지 않고, 한 번 더 추상화해⋯


  • MockHttpServletResponse에 세션 쿠키 주입하기

    🍪 세션이 만들어주는 쿠키 한 조각 세션을 활용하던 중, 컨트롤러에서 httpServletRequest.getSession()을 통해 세션을 생성하고 있었다. 이렇게 하면 톰캣 내부에서 세션을 생성할 때 응답 헤더에 Set-Cookie 필드를 추가하게 된다. 아래와 같은 예제 코드를 보자! 서버를 실행하고 /session에 접근하면, 아래와 같은 응답 헤더를 확인할 수 있었다. 예상했던 대로 Set-Cookie 필드에 세션 ID가 포함되어 있었고, HttpOnly와 같은 보안 설정도 확인할 수 있었다. 🧙🏻‍♀️ 헨젤과 그레텔 그리고 쿠키 프로젝트를 진행하면서 세션을 추가해야할 일이 생겼다.⋯


  • AWS EC2 무중단 Scale-up 적용기

    🔥 메모리 부족, 서버 중단 레벨 3 방학이 시작된 다음 날 토요일 아침, 리뷰미 서비스가 중단되었었다. 아침 7시 남짓부터 접속이 불가능했고, 그 이유는 리눅스 로그를 담는 syslog에서 확인할 수 있었다. 메모리 부족으로 인해 oom-killer가 java 프로세스를 중단하게 되었다. 2024-08-23T22:28:02.426195+00:00 kernel: Out of memory: Killed process 69224 (java) total-vm:2967296kB, anon-rss:326152kB, file-rss:1644kB, shmem-rss:0kB, UID:0 pgtables:1160kB oom_score_adj:0 그리고 그 메모리 부족을 일으켰던 건 nginx였다. 2024-08-23T22:28:02.185357+00:00 kernel: nginx invoked oom-killer: gfp_mask=0x140cca(GFP_HIGHUSER_MOVABLE|__GFP_COMP), order=0, oom_score_adj=02024-08-23T22:28:02.377758+00:00 kernel:⋯


  • [우아한테크코스 6기] 4차 데모데이: 런칭 페스티벌 트러블슈팅

    🚨 문제 발생 런칭 페스티벌이 끝나가는 오후 3시 50분 즈음, 여러 크루로부터 정상적이지 않은 웹사이트 응답이 내려온다는 이야기를 들었다. 직접 개발자 도구에서 확인해보니 꾸준하게 500 응답 코드를 내려주고 있었다. 뒤쪽에서 무언가 문제가 발생했다. 서버가 켜진 지는 3시간이 다 되어 가던 때였다. 런칭 페스티벌 직전에 몇 가지를 수정해 릴리즈했기 때문에 업타임이 길지는 않았다. API의 정상 동작을 확인했고, 처음 두 시간 정도는 모니터링 상에서도 큰 이슈가 존재하지 않았었다. 어플리케이션 로그는 즉각 확인할⋯


Categories