스프링 20

Netflix Hystrix를 사용한 클라이언트 회복성 전략 개념정리

본 글은 사내 업무에서 발생한 이슈에 대해 복기를 하면서 해당 내용이 잘 정리되어 있는 '스프링마이크로서비스 코딩공작소'의 내용을 정리하면서 실습한 내용의 일부입니다. 서론 모든 시스템, 특히 분산 시스템은 장애를 겪습니다. '회복력'을 갖춘다는 것에 있어서 대부분의 소프트웨어 엔지니어는 완전한 장애만을 고려합니다. 다음과 같은 이유로 이렇게 일부분 (완전한 장애)만을 고려하게 되는데요. 서비스 degradation(저하)는 간헐적으로 발생하고 확산될 수 있음: 사소한 부분에서 시작된 것이 초기에는 일부사용자의 불평이지만 그것이 완전한 장애로 이어질 수 있습니다. 애플리케이션이 대부분 부분적인 저하가 아닌 원격 자원의 완전한 장애를 처리하도록 설계한다: 결과적으로 자원 고갈이 진행되면 호룰하는 클라이언트..

REST API 에러 핸들링 best practice - 에러를 어떻게 내려 주어야 할까

이 글은 baeldung의 'Best Practice For Rest API Error Handling'를 번역하고 실습해본 내용입니다. Best Practice For Rest API Error Handling 소개 REST는 stateless(상태가 없는) 아키텍쳐이며 클라이언트가 서버의 자원에 접근하고 조작할 수 있습니다. 일반적으로, REST는 HTTP를 이용하여 클라이언트가 자원을 얻거나 상태를 바꾸는 API를 제공합니다. 이 튜토리얼에서는 REST API 에러에 대해 best practice를 배워봅니다. HTTP 상태 코드 클라이언트가 서버에 HTTP 요청을 보내면, 그리고 서버가 그 요청을 잘 받았다면, 서버는 반드시 클라이언트에게 그 요청이 성공적으로 처리됐는지 아닌지 알려주어야 합니다...

[Spring] 배포 환경별 로그 (logging) 설정하기

배포 환경별 로그 설정하기 본 내용은 필자가 공부하면서 적용해본 것이므로 best practice가 아닐 수 있습니다. 본인의 프로젝트에 맞는 방향으로 참고만 하면 될 것 같네요. 지난 글에서는 젠킨스를 활용하여 배포까지 해보았다. https://pjh3749.tistory.com/261 [Spring] Jenkins(젠킨스)를 활용한 스프링부트 앱 간단 배포하기 젠킨스를 활용한 스프링부트 앱 배포 젠킨스란? 젠킨스란 소프트웨어 개발 시 지속적 통합 (Continuous Integration) 서비스를 제공하는 툴이다. 젠킨스의 공식 홈페이지를 가보자. 메인화면에 젠킨스의 장점들을.. pjh3749.tistory.com 이제는 여러 서버별로 배포를 할 때 각자 다른 설정으로 배포를 해보려고 한다. 예를들..

카테고리 없음 2019.09.12

[Spring] RESTful의 HATEOAS 관련 내용 정리 - RESTful 하려면 어떤 조건들이 필요할까?

Hypermedia As The Engine Of Application state 링크에 사용 가능한 URL을 리소스로 전달하여 client가 참고하여 사용할 수 있도록 하는 것 참조문서:https://spring.io/guides/gs/rest-hateoas/ Resource Representation class 만들기 서비스 상호작용을 생각하면서 진행 해보자. 서비스는 GET 요청을 핸들하기 위해 리소스를 /greeting에 노출시킨다. (선택적으로 name 파라미터로 쿼리 스트링을 준다) GET 요청은 200 OK로 "greeting"을 JSON 으로 바디에 내려준다. 그 밖에, 리소스의 상태를 나타내는 JSON은 _links 속성안에 하이퍼미디어 요소들의 리스트가 매우 많다. 가장 기본적인 형태는..

[Spring] Spring Boot 로깅 (Logging) 공식 문서 내용 정리

스프링 Log reference 스프링 부트 공식 문서의 Log 부분을 번역하며 정리해보았다. 26.Logging 스프링 부트는 모든 내부로깅을 Commons Logging을 사용하지만 근본적인 로깅 구현은 남겨두었다. Java Util Logging, Log4J2, Logback은 디폴트 설정들을 제공한다. 각각의 경우 로거는 선택적 파일출력과 함께 콘솔 출력을 사용하도록 사전에 구성이 된다. 디폴트로, Starter를 사용을 한다면 Logback이 기본으로 사용된다. Java Util Logging, Commons Logging, Log4J, Slf4J를 모두 사용하는 의존적 라이브러리가 올바르게 작동하도록 적절한 Logback 라우팅이 포함된다. 자바를 사용하는데 많은 로깅 프레임워크들이 있다. 위..

[Spring] Bcrypt를 이용하여 비밀번호를 암호화하여 저장하는 방법 - 실제 프로젝트 적용기

암호화를 이용하여 원문을 해시화하는 간단한 방법을 찾던 중 Devglan 사이트에서 괜찮은 칼럼을 찾았다. https://www.devglan.com/spring-mvc/storing-hashed-password-database-java 다음 내용은 위 칼럼을 번역한 내용이다. 단순 텍스트에 비밀번호를 저장하는 것은 보안상 매우 취약하다. 이 글에서는 자바를 이용하여 데이터베이스에 해시된 패스워드를 저장하는 방법을 다룬다. 이렇게 한다면 BDA들 조차도 실제 패스워드를 빼내기 불가능하다. 기존의 MD5, SHA-1, SHA-2로 패스워드를 해싱할 수도 있지만 솔트를 치는것은 추가적인 보안을 만들 수 있다. (여기서 솔트를 친다는 말은 원문에 추가적인 문자열을 넣어서 해시를 강화한다고 이해하면 된다) 이 ..

[Spring] Spring Interceptor (인터셉터)와 WebTestClient Session (세션) 테스트 적용기

Spring의 인터셉터 사용과 그것을 테스트하는 WebTestClient에 대해서 다뤄보려고 한다. 특히나 로그인 같은 기능을 구현하는 경우 서버측에서 세션을 생성하게 되는데 그것을 어떻게 하면 간단히 테스트할 수 있는지 알아보자. 먼저 인터셉터가 어떻게 작동하는지 그림을 보자. 인터셉터는 요청을 가로채는 역할을 한다. DispatcherServlet 이전에 가로챌것 처럼 보였지만 사실은 그 이후에 요청을 가로챈다. DispatcherServlet 이전의 요청을 거치는 것은 Filter의 역할로 볼 수 있다. 그리고 중요한 점은 인터셉터는 핸들러 이전을 가로채지만 그 이후도 처리할 수 있다는 점이다. (그림을 보면 핸들러 작업 이후 다시 인터셉터로 들어가는 모습을 볼 수 있다. 잠시 후 코드로 내용을 확..

[Nexters]넥스터즈 (URL 단축팀) 활동 - 서버간 통신 gRPC 적용기

gRPC 적용 내용의존성 추가먼저 의존성 추가를 하는데 이렇게 3가지가 들어간다. io.grpc grpc-netty-shaded 1.18.0 io.grpc grpc-protobuf 1.18.0 io.grpc grpc-stub 1.18.0 그리고 컴파일러또한 의존성에 추가해준다. 출처 : grpc 공식 repo 그러면 proto 파일들의 기본 경로가 java폴더와 같은 level에 잡히게 된다. proto 파일의 정의그리고 이 폴더안에 .proto라는 파일을 만들어주게 되는데 자세한 내용은 이 쪽을 참고하였다. 출처 : protobuf from google 이 프로토버프 파일은 언어의 제약이 없다. (거의) 즉 이것의 최고의 장점은 범용성이다. 자바로 짜여진 grpc 서버와 파이썬인 클라이언트와 통신을 할..

[Nexters] 넥스터즈 (URL 단축팀) 정기활동 1주차 기록 - URL 단축 알고리즘 구현 및 코드 리팩토링

난 시간이 이렇게 빨리 갈 줄 몰랐다. 넥스터즈의 겨울 정기활동 2개월이 끝이 났다. 결과는 감사하게도 우수팀 선정! 매 주 세션 후 기록을 하려고 했지만, 너무 바빠서 기록할 틈이 없었다. 결론 적으로는 우리팀은 무사히 런칭을 마쳤다. 팀원들에게 너무 고맙다. 여태 했던 것들을 까먹을 까봐 적어 놓는다. 일단 우리 팀은 URL을 단축 하는 서비스를 개발하는 팀이다. 팀 구성은 (서버3, 디자인2, 프런트엔드3) 이렇게 되었다. 나는 서버 개발을 맡았다. URL을 단축 한다는 것은 큰 의미가 있다. 일반인들이 보기에는 저걸 굳이 줄여야할 필요가 있나라고 생각을 한다. 하지만 알게 모르게 그들도 일상속에서 단축 URL을 사용한다. 일례로, 가장 큰 서비스인 bit.ly가 있다. 원래 google의 단축 서..

[Spring] 스프링 JPA 흐름, JPA 관련 질문 내용 정리

JPA의 매핑 관계를 설정할 때 조금 복잡한 상황을 보자. 12345@ManyToMany @JoinTable(name = "recipe_category", joinColumns = @JoinColumn(name = "recipe_id"), inverseJoinColumns = @JoinColumn(name = "category_id")) private Set categories = new HashSet();cs 다 대 다 관계에서 @ManyToMany를 썼다. John Tompson께서 이런 상황은 많이 발생하지 않는다고는 한다. 지금 보면 Recipe와 Category 두 테이블이 다 대 다 관계로 묶여있다. 그래서 처음에 @JoinTable에서 이름을 "recipe_category"로 정해주었다. 이..

반응형