본문 바로가기

All

(28)
[개발생각] 캐시 스탬피드 캐시 스탬피드를 실무에서 겪었던때는 다음 티스토리팀에 다닐때, 처음으로 겪어봤다. 그때는 이게 왜이러지 하고 그냥 넘겼었는데...지금 생각하니 참 무지했다. ㅠ 캐시를 사용할때, 캐시가 있으면, 캐시된값을 전달하고, 캐시가 없으면, 디비등에서 조회하여 캐시를 만들고, 해당값을 전달하는 방식으로 코딩을 자주 한다. 여기서 중요한점은, 동시성이 중요한 시스템에서는 (대량 트래픽 서비스), 캐시가 없는 시점에 디비를 조회하는 행위를 여러 요청이 동시에 할수가 있다는 점이다. 캐시가 없는 시점에 캐시를 만드는 경우, 락을 걸지않는 이상, 캐시를 만드는 행위를 동시에 여러 요청들이 수행하게 된다. 여기서 중복 조회 이슈가 발생하게 된다. 엄밀히 보면, 하나의 요청만 디비를 조회하고, 캐시를 만들면 되는 건데,..
[개발생각] 내가 생각하는 개발자란? 초등학교 2학년 겨울쯤에 컴퓨터 프로그래머가 되기로 마음먹었고, 그 마음이 현재까지 한번도 변하지 않았었다.. 내가 가장 잘할수있다고 생각되는 부분이 컴퓨터 프로그래머, 개발자라고 생각했고, 그 생각은 아직도 변하지 않았다.현재도 딱히 다른걸 잘할수있다고도 생각이 들지 않는다.(사진,기타,게임 뭐 깔짝깔짝하긴했는데... 흥미나 실력이 잘 늘지를 않더라 ㅋㅋ) 하지만, 개발에 대해서의 마음가짐은 누구보다도 진심이라고 생각한다. 내가 만드는 서비스에 대해서,한번도 대충 만든다거나, 이정도면 됐다라고 생각하지 않았다.계속 발전시키고, 수정하기 위해서 고민했던것은 분명하다. 예전에 면접을 본곳에서 면접자가 이런이야기를 한적이 있다."엄청 예전일인데, 그당시 개발한 내용을 상당히 디테일하게 설명을 하시는군요, 준..
[개발생각] 트랜잭션 시간을 줄이자 외부API 호출과 DB 저장업데이트 로직의 트랜잭션을 보장하기 위해, 외부API호출을 DB트랜잭션안에서 하는 방법을 많이 사용한다. 일반적으로 많이 사용하는 방식이지만, 때에 따라서는 좀더 다른방법으로 접근을 해야하는 경우도 있다.외부API호출이 초단위로 넘어가는 느린 호출인경우 또는 더 최악으로 스크래핑같이 수초~수십초를 기다려야하는 호출인경우는 트랜잭션에 묶지 않고 트랜잭션에서 분리하여 호출하고, 문제가 있을경우, 보정을 해주는 방법으로 구현하는게 훨씬 시스템의 성능이나 안전성면에서 더 유리하다. 외부 호출이 느려지는 경우, 결국은 트랜잭셕이 길어짐에 따른 디비 커넥션 고갈을 가져올수있고, 그에 앞서서, 웹리퀘스트요청의 타임아웃이 먼저 발생할수도있다. 따라서, 외부 호출이 오래걸리는 작업인 경우는 트..
[개발생각] 게시판 JPA로 구현할때, 정해야 할것들 예전에 신입 개발자 뽑을때, 게시판 만들기 코딩 과제 많았다고 하던데, 왜인지 알겠다 ㅋㅋ.. 간만에 게시판을 만들어봤는데, 정말 어렵다. 구현이? 아니.. 대량의 호출에도 느려지거나 허무하게 죽지않을 정도로 성능이 나도록 만드는게 정말 어렵다. 어렵다기 보다, 고민 포인트가 정말 많았다. 우선 고민 포인트 몇가지가 있었다. 1) JPA의 관계설정을 사용해야할까? 게시판은 게시판, 포스트, 포스트의 댓글, 그리고 댓글의 댓글등, OneToMany, ManyToOne 의 관계설정이 많이 들어간다. 관계설정을 통해, cascade설정을 하여, 데이터의 저장/삭제등의 동기화를 일관적으로 맞추고, 관계설정에 따라, 알아서 댓글 또는 대댓글등을 불러올수있기에, 상단한 매력으로 다가온다.. 하지만, 편한만큼, 조..
[개발생각] 공지글 읽음 처리에 대해서.. 사용자가 공지글을 읽으면, 그 공지글을 읽음처리하려면 어떻게 해야할까? 참 어렵다... 대부분의 개발자들은 이게 뭐가 어려워! 테이블에 유저아이디, 공지글아이디 기준으로 읽음여부 Y/N저장하고 공지글하고 조인해서 여부 같이 붙여서 처리하면 되지!! 하는 사람도 있을것이고... 어렵다고 고개흔드는 사람도 있을것이다. 어렵다고 고개흔드는 사람이 나는 더 낫다고 생각한다.(그래도 성능을 생각했을 확률이 높은 사람이 이 사람일지도 몰라서..ㅎ, 아니면 정말 모르는건가!!!) 데이터베이스에 넣는 방식은 누구나 생각하겠지만, 상당히 안좋은 방법이다. 만약 100만명 유저가 있고, 공지글이 100개가 쌓여있다고 한다면, 데이터베이스 크기는 어떻게 될까?최약의 경우 모든 유저가 공지글을 읽었다고 하면, 100만x100..
[개발생각] StructuredTaskScope에 대해서 와.. 항상 코틀린이 문법적으로 더 깔끔하다고 생각했는데.. StructuredTaskScope 보고, 그렇지만은 안다는걸 느꼈다.. 코틀린을 하면서, 어렵고 난해하다고 생각하는 부분/기능이 코루틴이였다. 그 개념을 이해하는데, 정말 시간이 걸렸다. 이해한거같은데, 모르겠고, 모르겠는데, 이해되는 부분도있고 하는 애매한 상태가 오래됬는데, 관련 코틀린책을 3번 정도 읽으니, 이해를 마침내 되었다. 그래도 코루틴에서 난해한 부분이 "구조화된 동시성"에 대한 기능에 대한 이해였다.이해는 되지만, 사용법이 깔끔하지 않다고 할까? 특히 코드 블럭이 중첩되는 경우에 "구조화된 동시성"에 따른 동작 흐름을 판단하는건 많이 복잡했다. DB 트랜잭션 전파(Propagation)와도 비슷한 맥락이랄까? ㅋ 암튼, 코틀린..
[개발생각] 스크럼의 진정한 목적이 무엇일까? 스크럼은 가장 값싼 비용으로 유연한 개발문화를 만들수있는 방법중에 하나라고 생각한다. 하지만, 스크럼의 진정한 목적을 모르고, 진행을 하면 그냥 시간잡아먹는 하마와 같이 변할수도있다. 스크럼을 잘하기 위해서는 몇가지 갖추어야할 선제조건들이 필요하다.(값싸지만, 미리 선행되야 하는 조건들은 비싸다!!! ㅋㅋ) 1) 팀원들은 개인의 업무에 대해서 스케줄링을 할수있어야 한다. - 스크럼을 시작할수있는 전제조건은 개개인이 자기가 맡은 역할에 대해서 최선을 다하고, 최선을 다하는것을 넘어서 일정을 철저히 지킬수있는 책임감을 가지고있어야 비로소 스크럼을 할수있는 조건이 된다. 스크럼은 빠르게 토론하고 빠르게 만들고를 반복하는 애자일 전략의 한 방법이다. 따라서 빠르게 변화..
[개발생각] REDIS에서 아토믹처리를 하려면 REDIS를 깊게 사용하다보면, 트랜잭션처리 기능에 욕심이 생긴다. read_committed조회, rollback처리 이런것 있으면..이런생각 ㅋ REDIS는 기본적으로 완벽한 트랜잭션을 제공하는 다른 RDS의 성격이 아니다.빠르고 연산을 아토믹하게 처리하는 성격이고 또 그렇게 설계되었기 때문에, RDS에서의 트랜잭션처리를 완벽하게 구현할수도 없고,그렇게 사용하는게 개발메카니즘/철학과도 맞지않는 사용법이라고 생각한다. 다만 우리는 REDIS사용을 할때, 아토믹한 처리의 여러가지 방법이 존재하기에 이 방법은 잘 알고있어야 한다. 아토믹 처리의 방법중에는 크게 MULTI와 LUA SCRIPT방법 2가지가 있다. 1) MULTIMULTI명령어 이후의 명령어는 순서를 보장하고, 다른 명령어가 끼어들지못하게 한..
[개발생각] 붉은사막...펄어비스... 붉은 사막 오픈 하루전이다. 오늘 메타크리점수가 오픈되었고, 78점으로 주식은 하한가 크리를 먹었다..쩝 (주주로써 가슴아프다) 요즘 개발에서 드는 생각와 붉은 사막과 오버랩되는것이 있다.과연, 유저를 위한 시스템인가? 나만의 생각을 유저의 생각이라고 포장하여 만든 시스템인가?서비스를 만들때, 초기 설계/기획을 할때, 가장 주의해야하는 부분이 아닌가 한다.연차 자랑은 아니고, 연차가 많기에 이런 경우를 많이 겪었기에 기우가 생긴다. 대부분의 나의 안좋은 경험은 아래와 같았다. 기획 : "유저들은 이런 기능을 원합니다! 이렇게 해주세요!"개발 : "음.. 어떤 데이터에 기반해서 유저들이 원한다고 판단했을까요?"기획 : "....." 기획 : "이 기능은 유저들이 정말 필요로 하는 기능이고, 요청사항도 많이..
[개발생각] testFixtures에 대해서 테스트코드는 작성해야만 하는것, 하지만 유지보수에 대한 생각은 많이 안해도 되는것으로 생각하기 쉽다. 테스트 코드를 잘 작성해야, 프로젝트의 퀄리티가 올라가는 부분에 대해서는 말하지 않아도 누구나 인지하고 있을듯하다.따라서, 테스트 코드를 어떻게 잘 작성을 하는가에 많은 개발자들은 초점을 맞추고있다. 물론, 이 부분도 정말 중요하지만, 간과하면 안되는 부분이 있다. 테스트 코드를 어떻게 유지보수를 하면서 잘 관리해 나가느냐 또한 잘 작성하느냐와 더불어 엄청나게 중요한 부분이라는 것이다. 실제 비즈니스 코드는 리팩토링을 매번 하지만, 테스트 코드를 쉽게 짜도록 하는 유틸이나, 기능에 대한 부분은 아예 작성하지 않거나, 리팩토링을 하지않으며, 신경을 덜 쓰게 된다. 테스트 코드의 유지보수성을 높이기 위해서는..