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

서비스와 추상화 p.343) 객체지향적인 코드는 다른 오브젝트의 데이터를 가져와서 작업하는 대신 데이터를 갖고 있는 다른 오브젝트에게 작업을 해달라고 요청한다. 오브젝트에게 데이터를 요구하지 말고 작업을 요청하라는 것이 객체지향 프로그래밍의 가장 기본이 되는 원리이기도 하다. p.353) 트랜잭션이란 더 이상 나눌 수 없는 단위 작업을 말한다. 작업을 쪼개서 작은 단위로 만들 수 없다는 것은 트랜잭션의 핵심 속성인 원자성을 의미한다. 따라서 중간에 예외가 발생해서 작업을 완료할 수 없다면 아예 작업이 시작되지 않은 것처럼 초기 상태로 돌려놔야 한다. 이것이 바로트랜잭션이다. p.354) 두 가지 작업이 하나의 트랜잭션이 되려면, 두 번째 SQL이 성공적으로 DB에서 수행되기 전에 문제가 발생할 경우에는 ..

4장, 예외처리 p.281) 예외를 처리할 때 반드시 지켜야 할 핵심 원칙은 한 가지다. 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야 한다. SQLException이 발생하는 이유는 SQL에 문법 에러가 있거나 DB에서 처리할 수 없을 정도로 데이터 엑세스 로직에 심각한 버그가 있거나, 서버가 죽거나 네트워크가 끊기는 등의 심각한 상황이 벌어졌기 대문이다. p 283) 예외의 종류와 특징 자바에서 throw를 통해 발생시킬 수 있는 예외는 크게 세 가지가 있다. Error 첫째는 java,lang.Error 클래스의 서브클래스들이다. 에러는 시스템에 뭔가 비정상적인 상황이 발생했을 경우에 사용된다. 주로 자바 VM에서 발생시키는 것이고 애플리케이션 코..

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

프로젝트에서 이메일 중복 체크 관련해서 이슈가 하나 있었습니다. 클라이언트에게는 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만 쓰면 어떤 문제점이 있을까요?? 아무런 테스트 없이 바로 개발서버, 실서버에 서비스를 배포하게 된다면 예기치 못한 장애와 버그들이 생길 수 있습니다. 예상치 못한 실수 등의 예를 하나 ..

3장, 템플릿 템플릿이란 바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법이다. p.210) 오류가 날 때마다 미처 반환되지 못한 Connection이 계속 쌓이면 어느 순간에 커넥션 풀에 여유가 없어지고 리소스가 모자란다는 심각한 오류를 내며 서버가 중단될 수 있다. p.211) Connection이나 PreparedStatment에는 close() 메소드가 있다. 보통 리소스를 반환한다는 의미로 이해하는 것이 좋다. 보통 Pool 방식으로 운영된다. 미리 정해진 풀 안에 제한된 수의 리소스를 만들어 두고 필요할 때 이를 할당하고, 반환되면 다시 풀에 넣는..

2장, 테스트 p.145) 변하고 복잡해져가는 애플리케이션에 대응하는 첫 번쨰 전략이 확장과 변화를 고려한 객체지향적 설계와 그것을 효과적으로 담아낼 수 있는 IoC/DI 같은 기술이라면 두 번째 전략은 만들어진 코드를 확신할 수 있게 해주고, 변화에 유연하게 대처 할 수 있는 자신감을 주는 테스트 기술이다. p.146) 테스트란 결국 내가 에상하고 의도했던 대로 코드가 정확히 동작하는지를 확인해서, 만든 코드를 확신할 수 있게 해주는 작업이다. 또한 테스트의 결과가 원하는 대로 나오지 않는 경우에는 코드나 설계에 결함이 있음을 알 수 있다. 이를 통해 코드의 결함을 제거해가는 작업, 일명 디버깅을 거치게 되고, 결국 최종적으로 테스트가 성공하면 모든 결함이 제거됐다는 확신을 얻을 수 있다. p.149)..