일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 그리디알고리즘
- 애자일기법
- Java
- 자바
- 프레임워크
- 백준
- 개발자
- JPA
- Spring
- API
- db
- 코딩테스트
- 알고리즘
- 데이터베이스
- 애자일프로그래밍
- ES
- cleancode
- 읽기쉬운코드
- 엘라스틱서치
- framework
- Elasticsearch
- 클린코드
- database
- 코드
- 개발
- Baekjoon
- 코딩
- 애자일
- 그리디
- 스프링
- Today
- Total
목록Spring (26)
시뻘건 개발 도전기
단위 테스트 JUnit과 Mockito를 사용한 단위 테스트를 알아보는 시간~😄 JUnit 테스트는 테스트 케이스라고도 하는데 클래스 레벨에서 특정 기능을 테스트하는 것으로써 클래스 당 하나 이상의 테스트 케이스를 가진다. import org. junit. jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class StringTest { @Test public void testStringEquals() { String michael = "Michael"; String michael2 = michael; String michael3 = new String("Michael"); String michael4 = "Michae..
서킷 브레이커: 배치 내에서 호출하는 rest api에 과부화가 걸렸을 때 사용 서킷 브레이커 패턴을 구현하여 스프링 배치는 [스프링 리트라이]라는 라이브러리에 의존한다 implementation group: 'org.springframework.retry', name: 'spring-retry', version: '1.3.3' 서킷 브레이커로 래핑할 메서드를 식별 식별된 매서드에서 발생한 예외 건수가 임계값을 초과하면 서킷 브레이커가 해당 매서드에 대한 호출을 중지 및 대체 매서드로 트래픽을 라우팅 대체 매서드는 원래 메서드와 다른 처리방식 ex. api가 반환하는 값 대신 기본 값을 반환 특정 알고리즘을 기반으로 다시 원래 메서드로 트래픽을 되돌려 다시 정상인 상태로 되돌아 왔는지 테스트 서킷 브레이..
※ 본 '코인 자동 매매 프로그램 만들기' 시리즈 포스팅은 개인적인 학습용으로 개발하게 되는 프로그램입니다. 투자의 책임은 투자자 본인에게 있음을 알려드립니다. 이번 포스팅에서는 scheduling에 대해 설명한다. 내가 배치로 실행할 scheduler는 아래와 같다. Alarm class : 내가 투자를 하면서 가장 내 자신이 한심하다고 느낀 것이 하루종일 앱만 보고 있는 나의 모습이었다. 그래서 앱을 보지 않게 하기 위해 일정한 시간 간격으로 나의 포트폴리오 상태를 slack을 통해 알람을 발송한다. Buy class : 말 그래도 매수만을 담당한다. 그러나 내가 사지 않은 새로운 코인만을 매수한다. (추가매수 x) DailyVisual class : 나의 포트폴리오에 대해서 매일 9시에 시각화한다...
※ 본 '코인 자동 매매 프로그램 만들기' 시리즈 포스팅은 개인적인 학습용으로 개발하게 되는 프로그램입니다. 투자의 책임은 투자자 본인에게 있음을 알려드립니다. 이번 포스팅은 프로그램에 사용될 resource에 대해 이야기한다. encrypted.a.key={업비트에서_발급받은_암호화된_access_key} encrypted.s.key={업비트에서_발급받은_암호화된_secret_key} 나는 업비트에서 API를 사용하기 위해 발급되는 access key와 secret key를 한 번 암호화 해서 사용한다. 실제 배치에서는 해당 키를 사용해서 로그인을 시도할 때, 복호화가 진행되게 해서 보안에 신경썼다. 암호화의 종류는 선호하는 방식을 진행하면 된다. key={암호화_key_32byte} iv={암호화_i..
JPA를 사용하면서 가장 중요한 일이 java의 entity와 database의 table을 매핑하는 것이라고 해도 과언이 아니다. 따라서 우리는 매핑 어노테이션을 충분히 알고 써야할 책임이 있다. JPA는 4가지의 매핑 어노테이션을 지원한다. - 객체와 테이블 매핑 : @Entity, @Table - 기본 키 매핑 : @Id - 필드와 컬럼 매핑 : @Column - 연관관계 매핑 : @ManyToOne, @JoinColumn @Entity 테이블과 엔티티를 매핑할 때에는 필수로 사용해야한다. @Entity 어노테이션에서 지원하는 속성은 다음과 같이 정리할 수 있다. 속성 기능 default name 엔티티 명 지정. 다른 패키지에 이름이 같은 엔티티 클래스가 있을 때 사용하여 충돌이 일어나지 않도록 ..
플러시 flush는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 역할을 한다. 이 기능을 사용하면 다음과 같은 일이 일어난다. - Entity와 영속성 #2에서 알아봤던 것 처럼 변경 감지가 작동하여 스냅샷과 비교하여 수정된 엔티티를 찾는다. 수정된 엔티티가 있을 때 수정 쿼리를 만들어 SQL 저장소에 등록한다. - SQL 저장소의 쿼리를 데이터베이스에 전송한다. 영속성 컨텍스트를 플러시하는 방법은 3가지가 있다. 1. em.flush()를 직접 호출한다. - 테스트나 다른 프레임워크와 JPA를 함께 사용할 때 외에는 거의 사용하지 않는다. 2. 트랜잭션을 커밋하여 플러시를 자동 호출한다. - 변경 내용을 SQL로 전달하지 않고 커밋하면 데이터베이스에 반영이 되지 않는다. - 꼭 커밋 전에 영속..
그렇다면 영속성 컨텍스트가 왜 필요한지 알아보자. 엔티티 조회 영속성 컨텍스트는 내부에 1차 캐시라고 하는 녀석을 가지고 있다. 영속 상태의 모든 엔티티는 이 1차 캐시에 저장된다. 이해하기 쉽게 코드와 그림을 보자. Member member = new Member(); member.setId = "dotori"; em.persist(member); Member dotori = em.find(Member.Class, "dotori"); // 조회 1차 캐시 내에 @Id로 맵핑된 필드 값을 식별자를 가지고 엔티티가 저장된다. (아직 데이터베이스에 저장된 상태는 아니다.) 조회를 하게 되면 엔티티 매니저는 1차 캐시에서 해당하는 엔티티를 찾는다. 만약 1차 캐시에 없다면 데이터베이스에서 조회한다. (JPA란..
JPA를 사용하기 위한 설정과 동작 원리에서 언급했던가? 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하기 때문에 서로 다른 스레드 간에 공유해서 사용이 가능 하지만 엔티티 매니저는 여러 스레드가 동시에 사용하게 되면 동시성 문제가 발생하여 스레드 간의 공유가 불가능하다. 영속성 컨텍스트 영속성 컨텍스트는 JPA를 이해하기에 가장 중요하다고 할 수 있다. 영속성 컨텍스트는 '엔티티를 영구적으로 저장하는 환경'이라고 정의되어 있으나 도통 이 말이 이해가되지 않는다. 말로 풀어서 이야기 한다면 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 데이터베이스가 아닌 어떠한 공간에 보관하고 관리하는데 이 공간이 영속성 컨텍스트다. 지금까지 살펴본 persist(member)의 메소드가 바로..