분류 전체보기: 2108개의 글
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/bWvZj5/btrC8nJ9ECi/DNM1mKgzZw3a99MnH5lOLK/img.png)
인터넷 주소창에 naver.com 을 입력하고 Enter키를 눌렀을 때 일어나는 과정들을 알아보자. 1. 브라우저의 URL 해석/파싱 크롬 주소창에 www.naver.com을 입력하고 엔터를 눌렀을 때, 가장 먼저 일어나는 일은 URL을 해석하는 과정이다. https : 프로토콜 www.naver.com : Domain Name 443 : Port 즉, 어떤 프로토콜을 사용할 것인지, 어떤 URL로 서버에 요청을 보낼 것인지, 어떤 포트번호로 요청할 것인지 해석하는 과정이 이루어 진다. 여기서 참고해야 할 점은 우리는 주소창에 www.naver.com만 입력했지만 브라우저 내부적으로 기본값으로 http를 사용한다면 포트번호 80을 부여하고, https를 사용한다면 포트번호 443을 부여하게 된다. ☞ht..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/bYbyM8/btrC8SQBSJX/J6ROyZ9Nfq19b3tw37jc91/img.png)
동기/비동기 vs 블로킹/논블로킹 Redis를 세션 스토리지로 적용하는 과정에서 Java의 대표적인 Redis client 인 Jedis와 Lettuce 중 Netty 기반의 Redis 클라이언트인 Lettuce를 사용하기로 결정했다. Netty는 비동기 이벤트 기반의 고성능 네트워크 프레임워크인데, 여기서 나온 비동기의 개념을 확실히 짚고 넘어가고자 정리하기로 했다. 동기/비동기 vs 블로킹/논블로킹 동기와 비동기 또는 블로킹과 논블로킹 중 하나를 떠올리면 자연스럽게 나머지 단어들도 떠오르게 된다. 그 이유는 둘의 개념적인 의미가 비슷하기 때문이다. 하지만 실제로 두 개념은 서로 연관관계가 없는 별개의 개념으로 기억해야 한다. 동기/비동기 먼저 동기와 비동기에 대해 알아보자. 동기(synchronous..
상황에 따른 HTTP status 코드 사용하기 Rest API 서버를 개발할 때 400 : Bad Request와 200 : OK 만 사용하는 경우가 있는데, 상황에 따라 조금 더 명확한 정보를 전달할 수 있는 HTTP 상태코드를 알아보자. 1xx(Information) : 요청이 수신되어 처리중이며, 계속해서 프로세스를 진행한다. 최근에는 1xx 상태코드를 거의 사용하지 않는다. 2xx(Successful) : 요청을 성공적으로 수신했으며, 정상적으로 처리되었다. 3xx(Redirection) : 요청을 완료하려면 추가적인 행동(리소스)이 필요하다. 4xx(Client Error) : 클라이언트 오류, 잘못된 문법/요청 등으로 서버가요청을 수행할 수 없다. 5xx(Server Error) : 서버가 ..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/Op4Jt/btrC6gFsaQV/cbkmDU0N5QjrxTlFfOR9m0/img.png)
우리가 애플리케이션을 개발하면서 50명 정도의 이용 고객을 예상하고 서버를 구축했는데, 생각보다 인기가 많아져서 500명이 사용하는 애플리케이션이 되었다고 가정해보자. 이러한 경우 기존에 사용하던 서버로는 한계가 있다. 따라서 스케일 업과 스케일 아웃중 하나를 선택해서 인프라를 재구성 해야 한다. 스케일 업 vs 스케일 아웃 🔍스케일 업(Scale up) 스케일 업 이란, 우리가 현재 사용하고 있는 서버 자체의 성능을 증강시켜 처리 능력을 향상시키는 것으로, CPU 업그레이드 또는 RAM 추가 등으로 하드웨어 장비의 성능을 높이는 접근 방법이다. 스케일업은 비교적 접근하기도 쉽고, 실천하기도 쉬운 방법이다. 실제로 우리가 사용하는 컴퓨터가 느려졌다면 성능이 더 좋은 새로운 컴퓨터를 구매하는것이 가장 간편..
spring boot 2.5 버전 이상 사용시 Spring Security의 기본적인 정책은 URL에 더블슬래시가 들어가는 것을 허용하지 않는다. 예를 들면, test라는 리소스를 요청할 때 > http://localhost:8080/api/test 라는 URL을 사용한다고 해보자. WEB 소스에서 baseURL 을 잘못설정 뭐 그러한 이유로 http://localhost:8080/api//test 로 요청이 들어오면 서버에서는 아래와 같은 에러가 발생한다. org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized. at org.spr..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/Fzsn7/btrCWQ1OUDD/qLkAtqE9XpYRnyiOAGW0aK/img.png)
서버가 두 개 이상일 경우 발생하는 세션 불일치 문제 해결하기 지난번에 포스팅했던 서버를 확장하는 방법에서 scale out 방식으로 서버를 확장했을때 발생하는 문제점 중 하나인 세션 불일치 문제를 해결하기 위한 방법을 알아보자. 세션의 불일치가 무슨뜻일까? 단일 서버 환경에서는 session을 통한 로그인을 구현할때 session 불일치 문제를 신경쓸 필요가 없었다. 하지만 우리가 만든 프로젝트가 유명해져서 한대의 서버로 운영하는것이 불가능해졌다고 가정해보자. scale-out 방식을 사용해서 서버를 여러대로 늘렸을 때 발생하는 문제점중 하나가 바로 세션 불일치 문제다. 아래 그림들을 통해 무슨뜻인지 이해해보자. 먼저 3대의 서버중 서버1에서 로그인을 진행했다. 이 경우, 서버1에서는 해당 클라이언트의..
개요 JPA를 사용하면서 개발하다보면 간혹 LazyInitializationException 이라는 예외를 접하게 될 것이다. 이번에 포스팅할 OSIV는 해당 예외와 밀접한 관련이 있다. 또한 OSIV의 활성화 여부에 따라 JPA를 사용해서 개발하는 애플리케이션 성능에 큰 영향을 미치게 된다. 이번 기회에 OSIV에 대한 개념을 이해해보자. 1. 영속성 컨텍스트 먼저 선행되어야 할 지식은 JPA의 영속성 컨텍스트이다. 영속성 컨텍스트는 JPA에서 가장 중요한 개념중 하나로, 쉽게 말해 눈에 보이지 않으며 Entity를 영구히 저장하는 환경이라는 뜻이다. 하나의 트랜잭션 안에서 이루어지는 데이터들은 영속화되어 데이터를 조회할때 1차캐시라는 공간에서 가져오게 된다. 아래 예제들을 보면서 이해해보자. 📝예제 ..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/dI13Kc/btrCYwvotLO/TZ8mpFoGCXxBxEBVU7cbHk/img.png)
Lazy Loading JPA의 유일한 단점은 사용하기 쉬운만큼 성능적인 측면에서 발생할 수 있는 이슈를 간과하기 쉽다는 것인데, 성능이 안나올때 가장 먼저 고려해봐야할 부분이 즉시로딩(EAGER LOADING)으로 설정된 Fetch 전략이 있는지 확인하는 것이다. 하지만 @OneToOne 매핑시 Fetch 전략을 Lazy로 설정해도 EAGER로 동작하는 경우가 있다. 어떤 경우에 이러한 문제점이 발생하는지, 해결책은 무엇인지 예시를 통해 알아보도록 하자 예시 1. @OneToOne 단방향 매핑 @Entity public class User { @Id @GeneratedValue @Column(name = "USER_ID") private Long id; @OneToOne(fetch = FetchType..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/cMvJvi/btrCWQgni2I/z5Kgfa4vJmavxaKA7cDdw0/img.png)
트랜잭션 트랜잭션이란 더 이상 쪼갤 수 없는 최소 단위의 작업을 뜻하는 개념이다. 트랜잭션 경계 안에서 진행된 작업은 commit() 을 통해 모두 성공하던지, 아니면 rollback()을 통해 모두 취소돼야 한다. 하지만 트랜잭션이라고 모두 같은 방식으로 동작하는 것은 아니다. 이 밖에도 트랜잭션의 동작방식을 제어할 수 있는 몇 가지 조건이 있다. 트랜잭션 전파 트랜잭션 전파란 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 결정하는 방식을 말한다. 예를들어 A 라는 트랜잭션이 시작되고, 아직 끝나지 않은 시점에서 B 라는 트랜잭션안에 있는 메소드를 호출한다면 B는 어떤 트랜잭션에서 동작해야 할까? 자신을 호출한 A 트랜잭션에서 동작해야 할까, 아니면 자신의..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/byFogl/btrC0NwlZBE/zjS9cpgRLmtkKJ58dUD1B0/img.png)
@ModelAttribute는 어떻게 Formatter 없이 작동할까? @RequestParam 이나 @PathVariable로 들어온 문자열 값을 객체로 받기 위해서는 Formatter 가 필요하다. 아래 예제로 살펴보자. title이라는 String형 변수와 length라는 int형 변수를 가진 DTO이다. @Getter @Setter public class Music { String title; int length; } 만약 @RequestParam이나 @PathVariable로 넘어온 문자열 값을 Music객체로 받고 싶다면 아래와 같이 코드를 작성하면 된다. @ResponseBody @GetMapping("/hello/{title}"){ public String hello(@Pathvariabl..