본문 바로가기

전체 글

(66)
브라우저 에서 내 도메인을 검색하면 일어나는일 언젠가 누군가에게 "브라우저 URL 입력창에 'www.google.com'을 검색하면 어떤 일이 일어날까요?" 라는 질문이 꽤 유행하는 면접질문이라는 소식을 들었던 것 같다. 처음에는 그냥 별 생각 안 하고 넘어갔었는데 최근에서야 이 질문이 복잡한 웹기술에 대한 이해도를 답변받을 수 있는 좋은 질문이라는 사실을 알게 되었고 알고 보니 정말 좋은 질문이면서 좋은 주제인 거 같아 블로깅을 한다. 이글에서는 SpringBoot로 만든 서버를 서비스로 운영을 하고 있는 상태에서 브라우저로 접근하는 과정을 나열하려 한다. 서버의 IP를 174.173.172.171, 도메인을 mail.awesome.com이라고 가정하자. 브라우저는 Domain에 해당하는 IP를 찾는다. DNS (domain name service..
박사 학위 논문인 가비지 컬렉션 자바는 블루 칼라(주로 생산직에 종사하는 육체 노동자) 언어입니다.박사 학위 논문 주제가 아니라 일을 하려고 만든 언어죠. — 제임스 고슬링(자바의 아버지) — 저수준 세부를 일일이 신경쓰지 않는 대가로 저수준 제어권을 포기한다는 사상이 자바의 핵심이다. 아버지 입장에서는 ‘메모리 해제' 라는건 박사 학위 논문 급이니 우리보고 이런 대단한건 신경쓸 시간에 소녀시대 노래를 들으라고 하는거같다. 그 대단한 박사 학위 논문 주제를 해주는 가비지 컬렉션을 알아보자. 위의 표는 대부분의 객체 들이 짧은 시간동안만 활동한다는것을 확인한 그래프 이다. 이를 통해 약한 세대 가설(weak generational hypothesis) 이 만들어졌고 객체의 대부분을 짧은 기간만 활동하기에 JVM 의 Heap 영역을 설계할..
트랜잭션의 격리 수준 이라는 등가교환 MVCCRDBMS를 구현하기 위한 개념으로 ACID, Locking, Recovery 등 이 나왔지만동시성 제어 문제가 발생하였고 이를 해결하기 위해 잠금을 통한 상호배제를 사용했었는데상호배제로 인해 대기현상이 발생하여 DBMS의 동시성이 낮아지게 되었다 💡 동시성 제어 문제는 대표적으로 Dirty read, Non-repeatable read, Phantom read 등이 있다. 이러한 상호배제로 인해 낮아진 동시성문제를 해결하기 위해 읽기와 쓰기의 결합을 최소화할 수 있는 방법이 나오게 되었는데그게 바로동시에 발생하는 트랜잭션 속에서 데이터베이스에 저장된 데이터의 일관성과 격리성을 지킬 수 있도록 도와주는다중 버전 동시성 제어(MVCC)이다. MVCC는 SCN이라는 메커니즘을 사용하여 번호 값을 이..
db column명은 snake_case 가 최고다 데이터베이스 Column의 네이밍을 snake_case로 자주 사용하고 있었는데한번 camelCase로 하면 어떤가 하는 중에 발생한 일이었다.아래와 같은 Table를 생성해 두고JPA Entity를 만들어서 조회 쿼리를 호출해 보면 @Table(name = "test_entity")@Entitypublic class TestEntity { @Id @Column(name = "id") private Long id; @Column(name = "phone_number") private String phoneNumber;} select testentity0_.id as id1_0_, testentity0_.phone_number as phone_nu2_0_ from test_entit..
API Controller 주변 청소하기 spring boot를 사용하여 api 개발을 하면서 swagger을 함께 사용하다 보면 많은 API들이 다들 위와 같은 모습을 하고 있는 게 뭐랄까.. 애정이 안 간다. 코드를 아래의 기준으로 정리를 하여 애정이 생길만한 이쁜 모습으로 바꿔보려 한다. 한눈에 보기 좋을 것 중복 코드가 없을 것 api 파라미터는 스네이크 케이스이고 controller 인자는 카멜 케이스 일 것 @ApiOmplicitParams 만 사용하기 @ApiOperation(value = "주문 조회") @ApiImplicitParams({ @ApiImplicitParam(name = "productId", value = "제품 id", required = false, dataType = "string", paramType = "..
이벤트 페이지 그리고 데드락.. 그리고 FK 로 인한 공유 잠금.. 그리고 비관적 잠금.. 서비스에서 이벤트를 쿠폰으로 뿌리게 되면 엄청난 트래픽으로 인해 장애를 경험한적은 다들 한번쯤 있을것이다. 근데 나는 없다. 그래서 나는 혼자 이벤트를 만들고 혼자 참여하고 혼자 장애를 경험하고 혼자 고쳐보려 했다. 개발하는 어플리케이션은 정해진 쿠폰 수가 있고 쿠폰 재고가 끝날때까지 쿠폰을 받아갈수있는 이벤트이다. Event 엔티티와 Coupon 엔티티를 작성한다. @Entity @Table(name = "tb_event") @NoArgsConstructor @Getter @EqualsAndHashCode public class Event { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(unique = ..
Git Hook 을 멋들어지게 즐겨보기 Hook ?! Git 에서 어떠한 이벤트가 생겼을때 자동으로 특정 스크립트이다. Git 으로 형상관리 하는 프로젝트에는 .git 디렉토리가 있으며 그 밑에는 hooks 디렉토리가 있으며 그 안에 유용한 샘플 hook들이 들어있다. hook은 이벤트 별로 다양한 이름을 가지며 본 글에서 사용할 hook으로는 커밋 메시지 작성전에 동작하는 pre-commit, 커밋 메시지 편집기가 실행하기 직전에 동작하는 prepare-commit-msg 커밋 메시지 작성후 커밋이 완료되기 직전인 commit-msg 이렇게 3개를 활용 해보려한다. commit-msg 로 커밋 메시지 검사 https://www.conventionalcommits.org/en/v1.0.0/ Conventional Commits A specif..
Custom GitHub Action 으로 Chat-GPT 코드리뷰 제작하기 github에 pull request를 날리면 chat gpt 가 코드리뷰를 해주는 custom github action 을 만들려 한다. 만드는 방법은 아래의 링크를 참고할 수 있다. https://docs.github.com/en/actions/creating-actions/creating-a-javascript-action file.filename); let fileDiff = "" for (const file of changes) { const diff = await client.request(`GET /repos/${owner}/${repo}/commits/${sha}`, { headers: { Accept: "application/vnd.github.diff", }, }); fileDiff +..