2023-10-04-TIL
2023-10-04-TIL
Today I Learned
Kubernetes Books
쿠버네티스를 체계적으로 공부하려고 입문서 추천 목록을 모았다. 두 글 모두 입문서와 운영·보안 중심의 책을 함께 소개한다. 공식 문서는 개념 설명이 흩어져 있어 처음 읽기에는 길을 잃기 쉬우므로, 책 한 권으로 전체 구조를 잡은 뒤 공식 문서로 세부를 확인하는 순서가 무난해 보인다.
- https://www.practical-devsecops.com/best-kubernetes-books/
- https://www.knowledgehut.com/blog/devops/kubernetes-books
Go pprof
pprof는 Go 프로그램이 CPU 시간과 메모리를 어디에 쓰는지 보여 주는 프로파일러다. 표준 라이브러리에 두 가지 진입점이 있다.
runtime/pprof: 코드에서 직접 프로파일을 파일로 쓴다. Go 블로그의 Profiling Go Programs가 이 방식으로 벤치마크 프로그램의 병목을 찾아 가는 과정을 보여 준다.net/http/pprof: 실행 중인 서버에 프로파일링 HTTP 엔드포인트를 붙인다.
net/http/pprof 문서에 따르면 이 패키지는 보통 HTTP 핸들러를 등록하는 부수 효과만을 위해 import _ "net/http/pprof"로 가져오고, 경로는 모두 /debug/pprof/로 시작한다. 그다음 go tool pprof로 원하는 프로파일을 받아 분석한다.
1
2
go tool pprof http://localhost:6060/debug/pprof/heap
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
메모리 누수를 찾을 때는 시간 간격을 두고 heap 프로파일을 여러 번 받아 비교한다. 계속 늘어나는 할당 지점이 누수 후보가 된다. 운영 서버에서 이 엔드포인트를 외부에 그대로 노출하면 내부 정보가 드러나므로, 별도 포트나 내부망으로 제한하는 것이 안전하다.
- https://go.dev/blog/pprof
- https://pkg.go.dev/net/http/pprof
- https://medium.com/@luanrubensf/heap-dump-in-go-using-pprof-ae9837e05419
- https://pangyoalto.com/go-using-pprof-for-profiing/
- https://www.freecodecamp.org/news/how-i-investigated-memory-leaks-in-go-using-pprof-on-a-large-codebase-4bec4325e192/
- https://go.dev/src/runtime/heapdump.go
- https://www.nylas.com/blog/finding-memory-leak-in-go-service-dev/
Why Use JPA @Size Annotation Instead of DB Exception?
1
2
3
4
5
6
7
8
9
10
11
DB에 데이터를 삽입하거나 업데이트할 때 데이터베이스 무결성 제약 조건이 위반되면 데이터베이스에서 오류가 발생할 것입니다. 그러나 @Size와 같은 JPA의 유효성 검사 어노테이션을 사용하는 이유는 다음과 같습니다:
사전 유효성 검사 (Pre-Validation): JPA 유효성 검사 어노테이션을 사용하면 애플리케이션 레벨에서 데이터의 유효성을 사전에 검사할 수 있습니다. 이로 인해 데이터베이스 쿼리를 실행하기 전에 무결성 오류를 방지할 수 있습니다. 데이터베이스에서 오류가 발생하면 롤백이 발생할 수 있고, 이로 인해 데이터의 무결성이 깨질 수 있습니다. JPA 유효성 검사는 이러한 문제를 미리 방지하고 오류가 데이터베이스까지 전파되지 않도록 도와줍니다.
사용자 피드백: JPA 유효성 검사 어노테이션을 사용하면 사용자에게 데이터 입력 오류에 대한 명확한 피드백을 제공할 수 있습니다. 데이터베이스 오류는 종종 애플리케이션에서는 추상적이거나 이해하기 어려울 수 있으며, 사용자가 이해하기 어려울 수 있습니다. 그러나 애플리케이션에서 JPA 예외를 적절히 처리하고 사용자에게 오류 메시지를 제공하면 사용자가 오류를 이해하고 수정할 수 있도록 도와줍니다.
애플리케이션 로직 분리: 데이터 유효성 검사를 애플리케이션 레벨에서 수행하면 비즈니스 로직과 데이터 유효성 검사를 분리할 수 있습니다. 이렇게 하면 데이터 유효성 검사 규칙을 중앙 집중적으로 관리하고 재사용할 수 있으며, 유지보수가 더 쉬워집니다.
클라이언트 측 유효성 검사: JPA 유효성 검사 어노테이션은 클라이언트 측에서도 사용될 수 있으며, 입력 양식을 제한하거나 사용자에게 오류 메시지를 표시하는 데 도움이 됩니다. 이것은 사용자 경험을 향상시키는 데 도움이 됩니다.
요약하면, JPA 유효성 검사 어노테이션을 사용하면 데이터베이스 무결성을 유지하고 오류를 사전에 방지하며 사용자 피드백을 제공하고 애플리케이션 로직을 분리할 수 있습니다. 이러한 이점은 애플리케이션의 안정성과 사용자 경험을 향상시키는 데 도움이 됩니다.
위 정리에서 용어 하나는 바로잡아 둔다. @Size는 JPA가 아니라 Bean Validation 애너테이션이다. Baeldung 글은 세 가지를 이렇게 구분한다.
@Size(min, max): Bean Validation 표준 애너테이션으로, 값의 길이를 검증한다.@Length: Hibernate Validator 전용 애너테이션으로, 역할은@Size와 같다.@Column(length = n): JPA 애너테이션으로, DDL을 생성할 때 컬럼 길이를 정한다. 검증 기능은 없어서 더 긴 값을 넣으면 DB에서 SQL 오류가 난다.
그래서 둘을 함께 쓰는 것이 일반적이다. @Column은 스키마를, @Size는 그 스키마에 닿기 전의 검증을 맡는다. DB 오류로 막으면 어떤 필드가 왜 틀렸는지가 DB 벤더별 예외 메시지에 묻히지만, Bean Validation은 필드 이름과 메시지를 구조화된 형태로 돌려주므로 사용자에게 보여 줄 응답을 만들기 쉽다.
- https://www.baeldung.com/jpa-size-length-column-differences
What is Enrich?
Enrich는 메시지나 객체에 빠진 정보를 외부에서 가져와 채워 넣는 것이다. Enterprise Integration Patterns는 이를 Content Enricher 패턴으로 정의한다. 들어온 메시지의 키 필드로 외부 데이터 소스를 조회하고, 가져온 데이터를 메시지에 덧붙인다. 우편번호만 있는 메시지에 주 코드를 계산해 넣거나, 고객 ID로 고객 정보를 조회해 붙이는 예가 나온다.
Spring Integration은 이 패턴을 컴포넌트로 제공한다. 헤더를 추가하는 header enricher와, 별도 채널로 요청을 보내 받은 결과로 페이로드를 채우는 payload enricher가 있다. 여러 단계의 필터링과 보강을 순서대로 적용해야 한다면 각 단계를 하나의 처리기로 두고 체인으로 연결하는 Chain of Responsibility 패턴이 함께 언급된다.
- https://www.enterpriseintegrationpatterns.com/patterns/messaging/DataEnricher.html
- https://medium.com/javarevisited/chain-of-responsibility-pattern-in-spring-application-f79b35f341e5
- https://www.baeldung.com/chain-of-responsibility-pattern
- https://stackoverflow.com/questions/28651751/pattern-for-filtering-and-enriching-objects
- https://docs.spring.io/spring-integration/docs/current/reference/html/content-enrichment.html
- https://docs.spring.io/spring-integration/docs/current/reference/html/content-enrichment.html
댓글
아직 댓글이 없습니다