본문 바로가기

대규모 서비스를 지탱하는 기술 6~15장 (서버와 인프라 구축) 6~10장은 생략!! 과제라 정리하기 애매한 부분 6~10장까지는 데이터 압축, 알고리즘, 전문 검색 엔진 작성 등의 내용을 과제를 통해 보여준다. 그러나 읽어봤을 때 현시점에 정말 필요한 일인가? 하는 의문이 들어서 내용을 생략하려고 한다. 예를 들어 데이터 저장할 때 사이즈를 줄이기 위해서 데이터 압축을 애플리케이션 레이어에서 진행해야 하는지는 의문이다. 책에서는 과제로 정수 데이터를 압축하는 과제를 통해서 perl로 뭔가 하는거 같은데 실질적으로 그렇게까지 하는 회사가 몇 안 되는 것 같다는 생각이 들었다. 지인에게 물어봐도 압축까지 하지 않고 DBMS에서 자체적으로 최적화 해주기를 기대하는 것 같았다. 인코딩 디코딩하는데에 비용 즉, 오버 헤드도 생각하는 것 같다. (대용량 이미지 업로드, 썸네일..
대규모 서비스를 지탱하는 기술 1~5장 (문제 해결을 위한 근본 접근법) 대규모 서비스를 지탱하는 기술 서론 '대규모 서비스를 지탱하는 기술'라는 책을 공부하고 정리해보는 포스트입니다. 1~5장, 6~15장을 묶어서 2개의 포스트로 나눠 작성할 예정입니다. 2011년에 나온 책이고 절판되었지만, 개발자들 사이에서 현재까지도 회자되는 책이어서 읽어보았습니다. (중고 도서로 가격이 아주 비싸고, 국회도서관 우편 복사 비용도 비쌉니다... 😦) 웹을 지탱하는 기술 + 대규모 서비스를 지탱하는 기술 책 2권을 우편복사 요청했는데 비용이 너무 비싸더군요... ✔️ 주의사항 → 앞서 언급한대로 2011년 즉, 10년이 넘은 책이라 다소 변경된 내용이 많아 틀린 내용이 있을 수 있습니다. 이 책의 목적을 제 마음대로 해석했을 때, 대규모 서비스로 성장하면서 경험했던 내용을 간접 경험하며 ..
아무 관심 없던 @Retention 어노테이션 정리(RetentionPolicy SOURCE vs CLASS vs RUNTIME) @Retention annotation 관심 갖게 된 이유 자바에서 지향하는 방법은 아니지만 필요에 의해서 커스텀 애노테이션(Annotation)을 만들어야 할 때가 있습니다. 보통 예제 샘플 코드를 보면 메타 애노테이션으로 항상 붙어있고 RetentionPolicy=RUNTIME으로 되어습니다. 그렇기 때문에 그럴 때나 보게되는 애노테이션이라 @Retention 은 무시하고 @Target 정도만 확인하고 써왔습니다. 명확히는 @Retention 이라는 애노테이션이 있는지도 모르고 있었습니다. 그러던 중 회사 코드에서 JPA 엔티티(Entity) 클래스의 필드에 롬복(lombok)의 @NonNull 이 쓰인 것을 확인하고 이게 동작하는지가 궁금해지면서 찾아보게 되었습니다. 설명을 읽어보면 @Retenti..
JPA Entity Validation @Column(nullable=false)가 아닌 @NotNull을 써야한다고? JPA Entity Validation JPA Entity Validation. 여러분은 어떻게 유효성 검사를 하고 계신가요? 이번에 인턴사원분들과 코드리뷰를 진행하다가 새롭게 알게 된 사실을 정리하려고 합니다. 저는 보통 유효성 검사를 할 때, @Column(nullable = false) 나 @NotNull 같은거 쓰면 되지 않나?하고 지냈습니다. 조금 찾아보니까 여러 블로그에서 @Column(nullable = false) 를 사용하지말고 @NotNull을 써야한다고 나와있습니다. 그 이유는 대부분 @Column(nullable = false) 의 경우, JPA를 통해 ddl을 자동 생성할 때에만 create 쿼리(Query)에만 들어가고, Entity의 @Column(nullable = false..
도커 이미지는 한 번 작성하고 여러 곳에서 쓸 수 있는 것이 아닙니다. Docker image is not WORA(Write Once Run Anywhere) Docker Image is not WORA 배경 각설하고 배경을 말씀드리겠습니다. 회사 프로젝트 업그레이드 테스트를 도커 환경에서 하기 위해서 도커로 베이스 이미지 🧱를 만들었습니다. 그 후 만들어 놓은 베이스 이미지🧱를 private registry에 올리고 다른 서버 노드(도커엔진이 설치된)에서 해당 이미지를 가져와 컨테이너로 실행시켰습니다. 실행시키는 것 까지는 별 문제 없어보였으나, 업그레이드 테스트를 시도하니까 아래에서 설명할 내용처럼 에러가 났습니다. 분명 private registry에 올리기 전에는 잘 됐습니다. 분명 도커 이미지를 한 번 올려놓으면 어디서든 동일하게 격리된 상태로 동작해야되는 게 맞지 않나? 무슨 환경을 타나 했습니다. 🌳 현상 일반적인 애플리케이션 분석하듯 로그를 보니..
JPA 연관 관계 한방에 정리 (단방향/양방향, 연관 관계의 주인, 일대일, 다대일, 일대다, 다대다) JPA에서 가장 중요한 것 JPA에서 가장 중요한 것을 뽑자면, "객체와 관계형 데이터베이스 테이블이 어떻게 매핑되는지를 이해하는 것"이라고 생각합니다. 🏅 왜냐하면 JPA의 목적인 "객체 지향 프로그래밍과 데이터베이스 사이의 패러다임 불일치를 해결"이라는 것과 가장 직접적으로 연관되어 있기 때문입니다. Hibernate Document(2. Domain Model)에서도 객체와 테이블 매핑이 전체 스크롤 중, 조금 과장해서 표현하면 절반 수준의 비중인 것을 봐도 객체와 테이블 매핑의 중요성을 짐작할 수 있습니다. 그러나 객체와 테이블 매핑에 대한 내용을 조금 더 구체적으로 나누면 컬럼, 타입, 테이블, ... 등에 대한 1차원적인 매핑과 테이블 간의 연관 관계 매핑으로 나눌 수 있습니다. (개인 의견)..
2020년 어느 개발자의 회고🚩(공부에 멋이 밴놈? 보자 보자 어디보자 넌 다음에 보자) 첫 회고 블로그를 거의 4년째 작성하고 있는데 회고는 처음이다. (사실 무슨 회고를 2021년에 작성하는지 모르겠다. 하하... 이것마저 늦어버린 게으름이란...) 2년 전 즈음에 다른 블로그들 보면서 다들 꾸준히 회고를 작성하길래 나도 해볼까? 생각은 했었지만 '내가 뭐라고...', '회고가 무슨 큰 의미가 있겠냐...' 하면서 안 했다. 😭 그런데 회고를 한 번은 해야될 때라는 생각이 들었다. 생각을 좀 정리해야 할 필요가 있다고 느꼈고 나에게 다시 자극을 주기 위해서다. 사실 이번에 이직한 회사에서 처음으로 프로젝트 회고라는 것을 해보면서 떠오르긴 했다. 2020년에 목표와 회고 📘 보고 싶은 책 보기 이펙티브 자바 성공. 연초에 시작해서 한 번 보고 모르는 거 대충 넘어가는 식으로 봤다. 그리고 ..
Java Stream Collector 반쪽짜리 스트림을 쓰던 그대에게. Advanced Stream! Java Stream "Collector" filter, map, reduce, ... 뭐 이 정도? 이번에 "모던 자바 인 액션"이라는 책을 다시 보면서 반쪽짜리 스트림을 쓰고 있었구나... 하는 생각이 들었습니다. 이전에는 filter, map, reduce, flatmap, ..등 대충 이 정도는 어떻게 동작하는지에 대해서 알고 있고, 실제 업무에서도 사용해봤기 때문에 속칭 "스트림 좀 쓴다!" 하고 있었습니다.( 자부심 ) 그러나 이번에 "Collector"쪽을 보면서 배울 게 아직 많구나 하는 느낌을 받았습니다. Collector를 보고 난 후, 제 코드에서 확인한 것은 스트림에서 대부분의 마무리를 .collect(Collectors.toList()) 로 끝내고 있었던 것입니다. 🐲화룡점정이라 ..