일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- K8s
- spring
- Kotlin
- Collection
- redis
- Real MySQL
- gradle
- 자바 ORM 표준 JPA 프로그래밍
- 토비의 스프링
- mysql
- 백준
- 토비의 스프링 정리
- MSA
- SpringBoot
- thread
- 쿠버네티스
- Stack
- 스트림
- 스프링
- OS
- IntellJ
- 이스티오
- Stream
- Java
- GC
- 보조스트림
- jvm
- 자바
- JPA
- list
- Today
- Total
목록전체 글 (153)
인생을 코딩하다.

CI는 왜 발생했을까요? CI는 애자일 프로젝트를 수행하는 데 많은 도움이 됩니다. 애자일 방법론에 관해 이야기하기에는 이 글이 너무 길어지기 때문에 여기를 보고 오시면 좋을 것 같습니다. 애자일 개발 방법론은 빠른 배로플 기반으로 하는데, CI는 애자일에서 필요한 속도를 얻는데 도움을 줍니다. 하지만 어떻게 CI가 이 과정에서 도움이 될까요? 간단한 예제를 통해 알아봅시다. 기능을 개발할 떄는 코드를 여러번 수정하게 되는데, 이 과정에서 코드를 반영하고, 버전 관리 시스템에서 변경 사항을 가져오고, 소스코드를 빌드하고, 단위테스트를 진행하고, 통합된 코드를 빌드하고, 이를 묶어 배포하는 등 여러 과정을 수행합니다. CI 환경에서는 젠킨스 같은 도구를 이용해 모든 과정을 빠르게 에러 없이 진행할 수 있습..

안녕하세요. 이번에는 프로젝트에서 Redis를 적용해야 하는 이슈가 생겼는데요. Redis를 적용해야 하는 이유는 여기서 확인 하실 수 있습니다. 우선 Spring Boot Redis Docs와 함께 외부 Redis에 간단히 알아볼까요? https://docs.spring.io/spring-boot/docs/2.0.0.M7/reference/htmlsingle/#boot-features-connecting-to-redis hget "spring:session:sessions:9a398c47-36c6-4d33-95d1-80f51447f7eb" "sessionAttr:email" "\xac\xed\x00\x05t\x00\x0fadmin@gmail.com" 하지면 여기서 문제가 하나 있습니다. 스프링에서 로그..

프로젝트를 scale out 방식으로 확장할 계획을 하면서 그에 따른 session의 정합성에 관한 이슈가 생겼습니다. 별도의 독립적인 session 저장소로 세션의 정합성 문제를 해결하기 위해서는 대표적인 redis와 memcached 데이터 베이스를 고려해볼 수 있습니다. Amazon ElastiCache는 Memcached 및 Redis 캐시 엔진을 지원합니다. 각 엔진에는 몇 가지 장점이 있습니다. 이 항목의 정보를 활용하면 요구 사항에 가장 잘 맞는 엔진과 버전을 선택하는 데 도움이 됩니다. Memcached와 Redis 엔진은 둘 다 인 메모리 키-값 저장소입니다. NoSql 데이터베이스라고도 할 수 있죠. 그러나 실제로 상당한 차이점이 있습니다. session의 정합성 이슈를 해결하기 위해서..

프로젝트에서 세션 로그인 기능을 만들었습니다. 그리고 추후 저는 대용량 트레픽을 감당할 수 있는 서버를 만들 계획이 있었습니다. 대용량 트레픽을 감당할 수 있는 서버를 만들기 위해 scale up을 고려해 서버를 한 대만 놓는다면, 서버 한 대에 모든 부하가 집중되므로 장애 시 서버가 복구될 때까지 서비스를 중단해야 하는 상황이 발생합니다. 사용하려던 서비스가 중단된다면, 그에 안좋은 기억이 생기고 타 서비스로 이용을 바꾸거나, 서비스를 사용하지 않을 수 있는데, 이것은 엄청난 비즈니스 손실(수익 손실)이 생길 수 있습니다. 그러기 위해선 scale out을 고려해 서버를 확장해야 했습니다. 하지만 서버 확장시 제가 만든 세션 로그인 기능에 문제가 생길 우려가 있었습니다. 이 문제는 아래에서 그림과 함께..

Redis(Remote dictionary server)란? Remote -> 외부, dictionary -> HashMap (Key - Value), server -> 서버 Database, Cache, Message borker In-memory Data Structure Store Supports rich data structure Redis(레디스)는 REmote DIctionary Server의 약자로 오픈소스DBMS입니다. In-memory 데이터 저장소이며, Key-Value기반의 NoSQL DBMS입니다. 보통 DB, Cache(캐시), 메시지 브로커 등의 용도로 사용합니다. Redis를 효율적으로 쓰기 위해선 Cache에 관해 잘 알아야합니다. Cache는 나중의 요청에 대한 결과를 미리..

프로젝트에서 이메일 중복 체크 관련해서 이슈가 하나 있었습니다. 클라이언트에게는 json으로 "이미 존재하는 이메일입니다."라고 예외를 전환해서 JSON 통신으로 알려줬습니다. 그런데 생각해보니 실제 서비스를 돌리고 있다고 가정하면, 클라이언트는 알 수 있지만 정작 서버를 만든 저는 알 수가 없었습니다. 알기 위해서는 콘솔창에 찍혀야했습니다. 그래서 Log로 서버에도 기록을 해야겠다는 생각이 들었습니다. 추가로 개발도구를 24시간 실행하고 있진 않을터이니 추후 슬랙으로 정보를 받을 수 있도록 만들어야 할 것 같다는 생각도 들었습니다.. 슬랙은 컴퓨터 앞에 앉아있지 않아도 폰으로도 계속 확인할 수 있을터이니.. 위에서 말한 이메일 중복체크 관련 외에도 동작상태나 상황등에 관해 디버깅이나 모니터링을 위해 정..

application.yml에 아래 로직을 다 구현했다고 가정해봅시다. // application.yml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql: username: password: jpa: hibernate: ddl-auto: create-drop properties: hibernate: format_sql: true logging.level: org.hibernate.SQL: debug default Profile만 쓰면 어떤 문제점이 있을까요?? 아무런 테스트 없이 바로 개발서버, 실서버에 서비스를 배포하게 된다면 예기치 못한 장애와 버그들이 생길 수 있습니다. 예상치 못한 실수 등의 예를 하나 ..

@Transactional fun saveUser(userDto: UserDto) { // 이메일 중복체크 예외처리 로직 if (userRepository.existsByEmail(userDto.email)) { throw EmailDuplicateException() } ... 중간 생략 userMapper.save(user.toUserEntity()) } 위의 코드에서 saveUser메서드는 회원가입을 하는 API다. 이 메서드에는 이메일 중복검사에 관한 기능과 회원 정보를 저장하여 회원가입을 하는 기능이 있다. 또한 위에서 보이는 로직 말고도 추 후 변경이 생겨 다른 로직들이 더 추가 될 수 있다. 서비스에서 회원가입 기능의 흐름상 이메일 중복검사 기능은 어떤식으로든 들어가야 한다. 또 변경이 생겨..