일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 파이썬
- 운영체제
- 이펙티브자바
- 딥러닝
- Jetson
- 논문
- 네트워크
- 프로그래머스
- Python
- Spring Batch
- 자율주행
- 자바ORM표준JPA프로그래밍
- DeepLearning
- 영속성컨텍스트
- 장애물인식
- 자료구조
- 배달로봇
- JPA
- 알고리즘
- 논문리뷰
- Database
- cartograhper
- 자바
- 포인트클라우드
- Hibernate
- 아두이노
- MySQL
- Java
- 디자인패턴
- persistance context
- Today
- Total
목록분류 전체보기 (56)
제리 devlog
jpa를 사용해서 개발하다 보면 JpaRepository 인터페이스를 구현한 repository와 queryDsl를 사용하는 repoitory를 사용할 일이 잦다. 나는 간단한 조회, 엔티티 저장은 JpaRepository를 사용하고, 배치성 업데이트나 복잡한 쿼리 등은 querydsl을 사용하는 편이다. 그런데 JpaRepsitory, QuerydslRepository가 각각의 클래스로 분리되어 있다보니 서비스 계층에서 주입받아야 하는 클래스가 늘어났다. @Service class OrderService( private val orderJpaRepository: OrderJpaRepository, private val orderQuerydslRepository: OrderQuerydslRepositor..
무신사 왓쳐의 데이터의 업데이트는 하루마다 이뤄지므로 캐시의 의존성이 크다. 그런데 spring에서 제공하는 @Cacheable을 사용했을 때 발생가능한 key중복 문제에 대해서 정리하고 무신사 왓쳐에서 cache key중복을 해결한 방법에 대해 소개한다. @Cacheable @Cacheable은 스프링에서 제공하는 캐시관련 어노테이션으로 aop방식으로 동작한다. 별도의 설정없이도 어노테이션을 선언하면 캐시적용이 가능하기 때문에 간편하지만 여차하면 잘못된 캐시 결과를 가져올 수 있다. 예시를 보자 @EnableCaching @Service public class CacheService { @Cacheable(value = "productCache") public long findProductCount()..
테스트 코드에 대해 작성하고 리팩토링해가면서 깨달은 점과 적용한 부분에 대해서 개인적인 생각을 정리해보려고한다. 얼마전까지는 테스트 코드를 커버리지 위주로 생각하려는 경향이 강했었다. 라인 커버리지와 브랜치 커버리지를 높여서 단순히 이 수치로 얼마만큼 로직이 검증되었는지 표현하려고했다. 하지만 이 수치가 완벽하게 시스템의 안정성을 보장해주지는 않는다는 것을 느꼈다. 1. 무엇이 테스트의 대상인가? 아마도 테스트를 하면서 가장 중요한 대목이 아닌가싶다. 달리 표현하면 어떤걸 테스트해야하는가?라는 표현도 맞겠다. 하나의 예시를 들어보자. 무신사 왓쳐에서는 오늘 역대 최저가인 상품을 제공한다. 그렇다면 이 기능을 검증하기 위해서는 무엇을 테스트 해야할까? 생각하기에 앞서 오늘 역대 최저가인 상품은 어떤 과정으..
JPA를 사용하면서 연관 관계를 갖는 엔티티를 만들어 주기위해 연관된 엔티티를 조회해오는 경우가 있다. 아래 게시글에 댓글을 의미하는 Comment엔티티가 있다. @Getter @NoArgsConstructor @Entity public class Comment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZY) private Post post; @Lob private String content; @Builder public Comment(Post post, String content) { this.post = post; this.content = content..
synchronized는 lock을 사용해 동기화를 시킨다. 하지만 사용 방식에 따라 혼동되기 쉽다. synchronized는 4가지의 사용법이 있다. sychronized method, sychronized block, static sychronized method, static synchonized block. 이 포스팅에서는 이 4가지 방식의 차이인 lock이 적용되는 범위를 중점으로 다룬다. 1. synchronized method synchronized method는 클래스의 인스턴스에 대하여 lock을 건다. 다음과 같은 상황을 보자. 첫 번째로 하나의 인스턴스에 대하여 2개의 thread가 경합하는 상황이다. 결과를 확인해보자. 순서대로 lock을 획득하고 반납하였다. 두 번째로 각각의 인스..
static은 런타임시 클래스 로더에 의해 메서드 영역에 적재되며 프로그램이 종료될 때 까지 GC에 대상이 아니라고 알고있었다. 그런데, permanent영역과 metaspace에 관련된 글을 읽는 중 static이 heap영역으로 할당된다는 말이있어 혼란스러웠다. 먼저 permanent영역과 metaspace영역에 대해서 정리해보자. permanent영역 permanent영역은 클래스 내부의 메타 데이터를 저장하는 영역이다. heap영역에 속하며 class, method meta data, static object, variable, constant pool등을 관리했다. java8이전에는 permanent영역은 method영역으로 사용되었다. java8이후부터 사라졌으며 metaspace영역으로 대체..
Garbage Collector란? Garbage Collector는 대부분의 객체는 금방 접근 불가한 상태가되고, 오래된 객체가 젊은 객체를 참조하는 일은 아주 적게 존재한다는 'weak generational hypothesis'를 전제로 만들어졌다. Garbage Collector는 JVM의 runtime data area의 heap영역중 참조되고 있지 않는 객체를 데몬 스레드를 통해 제거한다. STW(stop-the-world)는 GC실행을 위해 애플리케이션이 멈추는 것을 의미한다. 대부분 GC알고리즘의 목표는 STW의 시간을 최소화하는 것이다. GC의 동작 과정 Hotspot VM의 heap영역은 young generation과 old generation영역으로 구분된다. young genera..
어댑터 패턴이란? 어댑터 패턴은 서로 다른 인터페이스를 어탭터로 연결하여 사용할 수 있게 해주는 패턴을 말한다. 어댑터 패턴이 어떤 상황에서 유용한지 확인해보자. public interface SamsungRemoteControl { void on(); void off(); } 삼성리모컨 인터페이스가 있다. public class SamsungRemoteControlImpl implements SamsungRemoteControl { @Override public void on() { System.out.println("on!"); } @Override public void off() { System.out.println("off!"); } } 삼성 리모컨은 위와 같이 동작한다. public class ..