본문 바로가기

Happyer16

(314)
AWS RDS 등급 정하기 웹 서비스 개발을 하면서 AWS infra를 구축할 때, 비용이 가장 많이 들어가는 것은 RDS 쪽일 것이다. ( 4xlarge가 한달에 천달러니까... ) 내가 사용하고 있는 RDS 등급이 서비스에 적합할까? 개발을 하면서 항상 애매한 것이 AWS ec2나 RDS 등급 설정이 였다. 과연 RDS에서 어떤 지표를 보고 등급을 조정해야 할까? CPU 사용량 : 보통 20~70%면 적당하다고 함. 이렇게 범위가 넓은 이유는 보통 트래픽과 비례하기 때문 ( 새벽, 피크타임 트래픽잉 보통 10배 차이남 ) 커넥션 RDS CPU에 영향을 미치는 쿼리 개선하기 RDS > slow_logs 를 가보면 3초 이상 걸리는 쿼리가 검색이 된다. 이러한 쿼리는 보통 개선이 필요하다 range 쿼리를 최대한 줄인다 ( 아무리..
JPA / ORM 개발시 성능 향상시키기 스프링 개발을 하면서 ORM을 일반적으로 사용한다. 그 이유는 아래와 같다고 생각한다. relational 은 Object-oriented 프로그래밍과 매치가 되지 않음 다양한 RDBMS SQL 사용법 하지만 ORM framework ( Hibernate, EclipseLink )를 사용하면 성능을 신경써야 한다. 프레임워크가 모두 해결해 줄것이라 생각했다가는 나중에 성능 향상을 위해 코드를 전부 수정하여야 한다. 1. 연관관계에서 기본 FetchMode를 사용하라. JPA에서 기본 FetchMode는 One-to-One, Many-to-One : EAGER One-to-Many, Many-to-Many : LAZY 이다. 다 알다시피, LAZY를 사용하면 query가 한번 더 날아가는 대신 지금 필요없..
Docker 이슈 - no space left on device 도커로 환경을 구성했는데 로그가 많이 쌓여서 해당 인스턴스에 문제가 생겼다.
JPA 8장 - 프록시와 연관관계 정리 객체는 객체 그래프로 연관된 객체들을 탐색한다. 그런데 객체가 데이터베이스에 저장되어 있으므로 연관된 객체를 마음껏 탐색하기 어렵다. JPA 구현체들은 이 문제를 해결하려고 프록시라는 기술을 사용한다. 이를 이용하면 실제 사용되는 시점에 데이터베이스에서 조회할 수 있다. 하지만 자주 사용하는 객체는 조인을 사용해서 함께 조회하는 것이 더 효과적이다. JPA는 즉시 로딩 ( eager )과 지연 로딩 ( lazy ) 를 지원 한다. 프록시 지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이를 프록시 객체라 한다. JPA 표준 명세는 지연로딩의 구현방법을 JPA 구현체에 위임했다. 따라서 지금부터 나오는 내용은 하이버네이트 구현체에 대한 내용이다..
API rate-limiting ( request throttling ) 개발하기 상황 내가 개발한 RESTful API를 public 에서 사용하게 된 경우, 사용량을 제한하고 싶을 수가 있다. 회원별로 사용량을 제한하고 싶은 경우에는 코드 단에 request throttling을 개발해야 한다. 개발 방법 google guava 라이브러리 사용하기 redis 를 이용하여 API rate-limiting https://github.com/mokies/ratelimitj/tree/master/ratelimitj-redis mokies/ratelimitj A Java library for Rate-Limiting, providing extensible storage and application framework adaptors. - mokies/ratelimitj github.com 허..
Spring JPA 이슈 모음 1. detached entity passed to persist @Table(name = "good_base") @NoArgsConstructor public class GoodsBase implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(updatable = false, name = "good_idx") private Long goodsId; @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "good_idx", referencedColumnName = "good_idx") private List g..
안드로이드 초보의 apk 배포해보기 1. APK 생성하기 : [Build] - [Generate Signed APK] 2. 앱을 개시하기 위해서 앱 서명하기 ( https://developer.android.com/studio/publish/app-signing ) 3. 참고 https://support.google.com/googleplay/android-developer/answer/113469?hl=ko
Docker 이슈 - 시스템 자원 부족 ( lack of system resources ) 현상 테스트 환경 t3.medium EC2에 docker container 10개 정도를 띄워놨었고 다음 날 출근을 해보니 instance status 가 죽어 있어서 모든 연결이 끊어졌다. 그래서 로그를 살펴보니 아래와 같은 것을 발견하였다. HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=4m40s450ms660µs405ns). 이 로그로 구글 검색을 해보면 대부분 답변이 시스템 자원이 부족해서라 한다. 시스템 자원 중에 어떤 부분이 부족하며? 이걸 방지할 수 있는 방법은 없을까? 아래 나오는 내용은 정답이 아니라 내가 스스로 검색한 부분이다. 잘못된 부분이나 잘 아신다면 댓글 부탁드립니다.... 도커의 자원을 제한..
Spring JPA 다대다 설정 및 성능 주의 ( Many To Many ) 소개 복잡한 비즈니스 요구 사항이 들어오게 되면 다대다 관계로 모델링을 진행하여야 한다. 이때 어떻게 해야하는지 주의해야 할 점에 대해 정리해보고 싶어 해당 글을 쓰게 되었다. Many to Many 학생이 좋아하는 수업을 정의할 때 다대다 관계가 필요해진다. 여러명의 학생이 수업을 좋아할수도 있고, 한 학생이 여러 수업을 좋아할 수도 있다. 이걸 RDB로 표현을 하면 아래와 같은 다이어그램이다. JPA 코드로 표현을 하면 아래와 같다. @Entity class Student { @Id Long id; @ManyToMany @JoinTable( name = "course_like", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns =..
Spring @Order 어노테이션 @Order 어노테이션을 쓰면 스프링 빈의 순서를 정할 수 있다. 기본 옵션은 Ordered.LOWEST_PRECEDENCE 이다. Spring 4.0때부터 collection에 component를 주입할 수 있게 되면서부터 @Order를 이용하여 순서를 정하는데도 사용하게 되었다. @Component @Order(1) public class Excellent implements Rating { @Override public int getRating() { return 1; } } @Component @Order(2) public class Good implements Rating { @Override public int getRating() { return 2; } } @Component @Order(..