일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코드
- 코딩
- 애자일프로그래밍
- 클린코드
- database
- Spring
- 데이터베이스
- 그리디
- 그리디알고리즘
- 엘라스틱서치
- 백준
- mongoDB
- 읽기쉬운코드
- 애자일기법
- spring boot
- 개발자
- Java
- Elasticsearch
- API
- ES
- 스프링
- 개발
- 자바
- 코딩테스트
- JPA
- Baekjoon
- framework
- cleancode
- 알고리즘
- 프레임워크
- Today
- Total
목록Framework/spring (22)
튼튼발자 개발 성장기🏋️

이전 포스팅에서 우리는 대표적인 낙관적 락과 비관적 락에대해서 간략하게 살펴보았다. 사실 나는 낙관적 락도 사용하지 않았고 비관적 락도 사용하지 않았다. DB의 부하를 줄일 수 있는 방법을 몰색하다가 redis를 사용한 [분산 락]이라고 하는 녀석을 파보았다. "왜 분산 락을 사용해야만 했는가?"에 대해서는 마지막에 언급하겠다. 분산 락 (Distributed Lock) 동시성 이슈(경쟁)로 동일한 리소스에 대해서 접근이 이루어질 때 리소스의 결함이 생기지 않게하기 위해서 분산된 서버들을 하여금 원자성을 보장한다. 분산서버로 쉽고 간편한 redis를 사용하였다. redis client 그렇다면 redis client로 무엇을 사용해야할까. 결론을 먼저 이야기 하자면 Redisson을 사용하는 것이 좋다...

최근 토이 프로젝트를 진행하면서 맞이한 동시성 이슈. 그 이슈는 "게시글의 조회수 증가"에서 맞이하게 된다. 서로 다른 사용자가 동시에 게시글을 열람한다면, 조회수는 +2가 되어야할테니... 따라서 동시성 이슈를 해결하기 위해 락을 획득하기로했다. 일반적으로 알고 있는 락은 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)이있다. 낙관적 락(Optimistic Lock) 동시에 동일한 데이터에 대한 수정을 서로 연관되지 않게 방지하는 기능으로써 해당 데이터의 "version"을 확인하여 엔티티의 변경을 감지한다. "낙관적"이라는 말처럼 "여러 트랜잭션이 동일한 데이터를 동시에 수정하지 않는다."라는 가정을 가지고 트랜잭션의 충돌을 방지한다. 한 마디로 "일단 데이터 가..

단위 테스트 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가 반환하는 값 대신 기본 값을 반환 특정 알고리즘을 기반으로 다시 원래 메서드로 트래픽을 되돌려 다시 정상인 상태로 되돌아 왔는지 테스트 서킷 브레이..

Spring을 쓰면서 데이터베이스에 접근할 때는 DTO는 필수조건일 것이라 생각이 든다. 나는 개인적으로 DTO를 Entity라고 생각하는 경우도 종종 있다. (그래야 이해하기 쉽기 때문...) 우리는 getter와 setter를 아주아주 자주 만들어 사용할 것이다. 굳이 spring이 아니더라도, 작은 어플리케이션 만들 때 조차 필요할 수 있다. 오죽하면 eclipse 자체에서 생성해주는 기능과 단축키까지 설정 되어 있겠는가..?ㅋㅋ 그것도 모자라서 Lombok이라고 하는 녀석은 어노테이션을 이용해서 자유롭고 편리하게 getter와 setter를 생성해서 사용할 수 있다. Lombok은 그냥 dependency를 걸어주고 바로 사용할 수 있는 녀석이 아니다. 사용 전에 필수 적으로 진행해야하는 절차가 ..

최근 개인적으로 프로젝트 하느라 H2 데이터베이스를 연동해보았다. H2는 굉장히 생소했지만 테스트 용으로 많이들 사용하는 것 같다. "인메모리 데이터베이스"로 분류되어 있으며 용량이 작고 속도가 빠르다는 장점을 가지고 있다. 이 H2를 spring MVC에 연동하는 것이 굉장히 힘들었다. mySql이나 몽고와는 살짝 다른 건지.. 아니면 내가 spring을 공부하는 단계라서 그런건지 너무 어려웠다. 약 3일동안 삽질해서 연동을 해보았다. 가장 먼저 연동을위한 repository를 dependency 걸어주자. 참고로 나는 Gradle Build tool을 사용해서 maven을 사용한다면 pom.xml에 알맞은 버전을 걸어주면 된다. dependencies { compile group: 'org.sprin..
repository 프록시는 메소드 명으로부터 query를 가지고 오는 방법이 두 가지가 있다. 메소드 명으로부터 query를 직접 가지고 오는 방법. 수동적으로 정의된 query를 가지고 오는 방법. 이 두 가지 방법의 선택은 스토어에 따라 달라질 수 있다. 실제 어떤 query가 만들어 지는지는 어떠한 전략(?)이 있다. CREATE query 메소드의 이름을 가지고 query를 만든다. well-known prefix를 모두 제거하고 나머지 이름 부분 가지고 파싱해서 query를 만든다. (ex. findById()) USE_DECLARED_QUERY 선언 되어있는 query를 찾는다. 찾지 못하면 예외가 있으니 예외처리를 해주어야한다. 어노테이션을 사용하여서 어딘가에 정의되어 있을 수 있다. CR..
이전 글에서 query method를 만드는 4 step에 대해 알아 보았다. Repository를 상속한 인터페이스 만들기 query method 정의하기 String Data JPA 활성 시키기 주입 받아서 사용하기 상위 단계 중에 1step에 대해 알아보려고 한다. 보통 Repository와 CrudRepository와 PagingAndSortingRepositoryRepository 그리고 JpaRepository 중에 하나를 상속을(extends)를 받아 사용할텐데, 이 것을 어노테이션을 사용할 수도 있다. 바로 이런 식으로. @NoRepositoryBean interface MyBaseRepository extends Repository { Optional findById(ID id); S s..