Redis를 사용하던 와중 특정 오류가 잡혀 골치 아픈 적이 있었다. public class CacheConfig { private final RedisConnectionFactory redisConnectionFactory; @Bean public CacheManager cacheManager() { RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(Redi..
본 필자는 회사에서 일하면서 고객의 정보를 변경하면 수정 이력을 나타내는 기능과 수정 했던 사람을 추적해야 하는 기능을 구현해야 했다. 기존에는 직접 업데이트가 될 때 마다 전 후 비교를 통해 시간을 업데이트 시키는 방식으로 복잡하게 비즈니스 로직이 수행되었는데 필자는 이걸 좀 더 수월하게 이용하기 위해서 JPA Auditing 기술을 이용하고자 했다. JPA Auditing 이란? 데이터베이스에서 누가 수정하고 언제 수정되었냐는 기록은 매우 중요할 수 있는 데이터이다. JPA에서는 이러한 기능을 추적할 수 있는 기능을 제공하고 있는데 그것이 바로 JPA Auditing 기술이다. 이 기술을 사용하면 자동으로 JPA에서 자동으로 생성이나 수정 발생 시 시간을 매핑하여 데이터베이스에 넣어준다. 사용해보자!..
@Test @DisplayName("데이터베이스에 존재하는 게시판을 10개 조회해온다.") void findAll() { for (int i = 0; i < 10; i++) { Board board = Board.builder() .title(Title.from("테스트 용입니다. " + i)) .content(Content.from("테스트용 Content 입니다. 재미있다아앙")) .build(); boardService.create(board, 1L); } Pageable pageable = PageRequest.of(0, 10, Sort.Direction.DESC, "id"); List boards = boardService.findAll(pageable); assertThat(boards.siz..
CQRS 패턴이란? CQRS는 Command Query Responsibility Segregation의 약자로 "명령 조회 책임 분리" 라는 뜻을 갖고 있다. 이는 애플리케이션을 구성하는 아키텍처 패턴 중 하나로 명령과 조회에 대한 책임을 분리하여 아키텍처를 구성하는 것이다. 그럼 왜 그렇게 해야하는지 알아보자 Why? 일반적인 애플리케이션은 데이터를 연결된 데이터베이스에 레코드로써 생성하거나 조회하거나 갱신 삭제를 한다. 그리고 이렇게 애플리케이션이 데이터를 레코드로 저장하는 과정에서 데이터는 특정한 모델로 다뤄진다. 예를 들어 주문 내역이라는 데이터는 애플리케이션 내에서 id, 주문 상품, 일시 등으로 속성을 지니는 하나의 클래스 모델로써 다뤄지고 DB에는 레코드로써 저장되어 조회 갱신 삭제될 수 ..
백엔드 서버에서는 JSON을 통해 클라이언트와 통신한다. 그렇다면 자바는 어떻게 객체의 데이터를 JSON 데이터로 바꿀 수 있을까? 어늘은 그 방법인 직렬화에 대해 알아볼 것이다. 그리고 그걸 역직렬화를 통해 자바 객체로 받아올 수 도 있습니다. 직렬화 / 역직렬화 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터 변환하는 것을 말한다. 시스템 적으로는 JVM의 메모리에 힙 또는 스택에 존재하는 객체 데이터를 바이트 형태로 변환하여 직렬화 한다. 자바에서는 Serializable 인터페이스를 통해 직렬화를 하고 있다. 반대로 직렬화는 역으로 바이트 형태의 데이터를 객체 또는 자바 시스템의 데이터로 바꿔주는 것을 말한다. 마찬가..
자바는 동시성 문제를 위해 4가지 해결책을 갖고 있다. Syncronized 키워드 Concurrency 라이브러리 Atomic volatile 우리는 그 해결책인 4가지 키워드를 잡고 학습해볼 것이다. Synchronized 자바는 mult-thread 를 지원하는 언어이기 때문에 여러 thread가 자원을 공유하는 경우 RaceCondition이 발생하고 데이터 일관성을 지킬 수 없게되는 위험 요소가 존재합니다. 그렇기 때문에 항상 동기화를 통해 임계영역에서 안전하게 작업하는 동안 Lock을 걸어 문제를 줄여야 하는데 이 때 사용하는 키워드가 Synchronized이다. synchronized 키워드는 공유 자원에 대한 동시접근을 막아준다. 코드는 다음과 같이 사용하면 된다. 블록에 거는 방법 pub..
정확히 말하자면 자바는 Synchronous / blocking 방식을 지원하는 언어다. 그렇다면 Synchronous / blocking이란 무엇일까? 그리고 반대 되는 Asynchronous / non-blocking에 대해서도 알아보자 Synchronous / Blocking 먼저 각자의 뜻을 알아보면 Synchronize는 간단하게 두 개의 주체가 서로 동시에 수행하거나, 동시에 끝나거나 끝나는 동시에 시작하는 것을 말한다. 이를 쉽게 예로 들자면 이런 것이다. 한명의 직원이 있고 상사가 있다고 가정해보자 동기적으로 동기적인 직원은 상사에게 서류를 제출하고 상사가 일을 처리할 때 까지 계속 물어볼 것이다. 그리고 상사가 일처리를 끝내고 결과를 줘야만 직원은 다시 가서 하던 일을 할 수 있다. bl..
자바는 멀티 스레드 프로그래밍을 지원하는 언어이다. 그렇다 보니 아무 스레드가 와서 마음껏 자원을 읽고 쓰고가 가능하다면 클라이언트가 원하는 정보를 얻기 힘들 것이다. 그렇기 때문에 자바에서는 Lock을 걸어 공유 자원이 Thread-safe 하게 해준다. 그렇다면 자바에서는 어떻게 Lock을 걸 수 있을까? Monitor(모니터) 모니터는 고급 언어의 설계 구조물로서, 개발자의 코드를 상호배제 하게끔 만든 추상화된 데이터 형태이다. 세마포의 소유와 획득 과정을 모니터 자체 내에서 처리하기 때문에 코딩하기에 조금 더 편리하며 잘못된 코딩으로 인한 문제 발생이 세마포보다 덜 하다. 또한 모니터는 세마포의 block/wakeup과 유사한 wait/signal을 제공한다. 세마포는 리스트 형태로 사용하지만 모..
대부분 제네릭에 대해 잘 알고 있다고 시작하는 포스팅이니 잘 모른다면 기본을 공부해보고 오는 것을 추천한다. https://blog.naver.com/ilgolc/222552815030 Java_Week14 Generics 란? 제네릭은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크... blog.naver.com 제네릭 기초에 관한 내용들이 포스팅 되어 있으니 한 번 보고 이 글을 읽기를 바란다. 제네릭은 자바 5 부터 나온 문법으로 기본적으로 컬렉션에서 많이 볼 수 있었을 것이다. 제네릭은 다음 처럼 사용할 수 있다. List list = new ArrayList(); // 뒤에 선언 부에는 생략이 가능 그럼 바로 시작해보자. 로 타입 보다 Generic 제네릭을 사용..
우리는 종종 Key - Value 구조의 HashMap을 사용한다. HashMap은 Key 중복이 없어 중복을 거르고 Key 값으로 빠르게 값을 찾아오기에 조회하는데에 이 점이 있다. 필자는 본 내용을 Map에 대한 사전 지식에 대해 다 갖고 있다는 전제하에 글을 써볼까 한다. HashMap이 중복 key를 걸러낼 수 있는 이유 자바는 모든 객체마다 고유한 hashcode를 갖는다. 이 hashcode는 해싱 알고리즘을 이용하여 만들어낸 코드로 내부 구현은 객체의 주소를 이용하여 만들어진다. public class HashEx1 { public static void main(String[] args) { String str1 = "hello"; String str2 = "world"; System.out..
- Total
- Today
- Yesterday
- 개발자
- 프로젝트
- 게시판
- 면접 준비
- 면접
- 프로그래밍
- docker
- 취업
- 면접준비
- Redis
- 개발
- DevOps
- swarm
- Spring
- thread
- DB
- 인터뷰
- Kotlin
- JPA
- 취업준비
- MySQL
- CS
- IT
- 취준
- 자바
- 코딩
- 동시성
- 코드
- 백엔드
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |