Spring

JVM/Spring

[SPRING] 스프링 MVC 구조? (DispatcherServlet?)

🙃 서론 스프링은 정말 사용자가 사용하기 편한 기능들을 많이 제공해준다. 그 중에서도 컨트롤러는 정말 다양한 파라미터와 리턴 값을 사용자 뜻대로 이것저것 가져와서 사용할 수 있다. 예를 들어 파라미터로 String이나 Integer 로 받을 수도 있고, 직접 만든 DTO 객체로도 받을 수 있다. 또, 리턴 값으로 String으로 view 경로를 보낼 수도 있고, 진짜 String을 보낼 수도 있고, ModelAndView 를 보낼 수도 있다. 어떻게 Spring은 이렇게 다양하게 사용자 입맛대로 만들 수 있게 해주는지에 대해서 파악해보자. 스프링 MVC에서 받을 수 있는 인수 - 링크 😆 본론 Dispatcher Servlet 일단, 가장 중요한 Dispatcher Servlet에 대해서 개념을 잡고 가..

JVM/JPA

[JPA] save() isNew를 사용하여 성능개선 하기

😎 서론 사내 모든 프로젝트에서는 데이터베이스에 값을 저장할 때 아이디를 유니크한 값으로 자동생성해주는 로직을 만들어 별도로 태운 후 save()를 하게 된다. 결국 이로 인해 처음 INSERT를 하기 위해서 save를 보낸 모든 데이터 또한 SELECT를 꼭 호출하고, INSERT를 호출하게 되는 문제가 있다. 이는 데이터가 많으면 많을 수록 성능저하에 큰 문제가 있기에 이 로직을 파악하고 성능개선하는 방법을 공유해본다. 😉 본론 ⏳ save() 로직 파악하기. SimpleJpaRepository 클래스에 있는 save()메소드는 아래와 같이 동작을 한다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity ..

JVM/Spring

[SPRING] @Transactional readOnly 성능향상 이유

🙄서론 트랜잭션에 있는 readOnly가 읽기전용모드로서 cud가 발생하게 되면 에러를 뱉어주고, 읽기만 가능한 기능으로 알고 있었다. 그런데, 왜 성능향상에도 도움이 되는가에 대해선 자세히 몰라서 알아보았다. 😎본론 @Transactional(readOnly = true) 트랜잭션에서 readOnly=true 라는 옵션을 설정한다. FlushMode 를 MANUAL로 변경하여 dirty checking(변경감지) 을 생략한다. flush와 commit이 일어나지 않고, 이로 인해 영속성 컨텍스트에서는 스냅샷을 보관하지 않아 약간의 성능향상이 이루어지는 것. 크게 눈에 띄게 성능향상이 이루어지지는 않는다고 한다. 보통 사용하는 이유로는 해당 메소드가 변경이 되면 안되고, 조회하는 걸 명확하게 명시해주기 ..

JVM/Spring

[SPRING] synchronized와 @Transactional 을 동시에 사용 시 문제점

😗서론 @Transactional 어노테이션과 synchronized을 동시에 사용하고 싶은 경우가 있을 수 있다. 트랜잭션 격리수준과 별개로 해당 메소드를 동기화를 적용시키고 싶을 때. 하지만, 한 메소드 위에 해당 Transactional, Synchronized를 동시에 적용 시 원하는대로 작동하지 않을 수 있다. 그 이유를 알아보자. 😎본론 아래 예시는 스택오버플로우를 번역하여 풀어서 정리했습니다. 🤨뭐가 문제지? 일단 Synchronized를 사용하는 이유는 해당 메소드를 한 쓰레드에서만 돌리기 위해서다. 하지만, 트랜잭션이 같이 정의가 되어있다면 첫 번째 쓰레드가 끝나기 전 두 번째 쓰레드가 발동할 수도 있다. 그 이유를 살펴보자. @Transactional public synchronized..

JVM/JPA

[QueryDSL]like, contains 차이

서론 회사에서 자체프레임워크를 사용하다보니 기본으로 제공되는 like와 contains를 잘 사용할 일이 없었다. 그러다 최근에 사용할 일이 있어 like를 사용하게 되었는데, 원했던 어디든 포함이 되는 like가 진행되지 않아 찾아보게 되었다. 본론 둘 다 쿼리가 날라가는 것은 LIKE로 날라가지만 contains는 앞 뒤로 %를 자동으로 붙여주고, ex) %튀김% like는 입력한 그대로 날라간다. ex) 튀김 사용 예 contains : 앞, 중앙, 뒤 상관 없이 문자가 포함이 되는지 확인하고 싶을 때 like : 앞, 중앙, 뒤 원하는 곳에 포함이 되는지 확인하고 싶을 때 직접 %를 붙여서 사용

JVM/Spring

[SPRING] feign은 뭘까?

🤔 서론 다른 서버와 통신을 하기 위한 API 를 설계 및 개발을 하면서 알게 된 feign에 대해서 정리하기 위해 작성하게 되었다. 그 전까지는 spring에서 다른 서버를 호출해본 적이 없었기 때문에 어떻게 하는지에 대한 궁금증이 있었는데 이번 기회에 알게 될 수 있었다. 🤷‍♂️ feign은 그래서 뭔데! - Netflix에서 만든 HTTP client binder로서 기존 http client 작성을 쉽게 만들어주는 라이브러리이다. - interface를 작성하고 annotation을 붙여서 쉽게 사용할 수 있기 때문에, HTTP API를 균일하게 바인딩하여 복잡성을 줄여준다. - 이전에는 RestTemplate 방식과 WebClient 방식이 존재했지만 현재 스프링 커뮤니티에서는 RestTemp..

JVM/Java

[Java]BeanUtils.copyProperties를 사용해보자

- 첫 작성일 : 21년 2월 11일 velog 블로그 BeanUtils.copyProperties ? 스프링에서 제공해주는 메소드로서 객체를 쉽고 간결하게 복사할 수 있게 해준다. 언제 사용하지? 예를들어 객체를 수정하기 위해 파라미터로 값을 받았을 때 필드가 많으면 많을 수록 setter의 횟수가 늘어나고 코드의 길이도 늘어나기 때문에 가독성과 소요시간이 떨어지게 됩니다. 이때 BeanUtils.copyProperties 메소드를 통해 한줄로 해결할 수 있습니다. 또한, 그대로 복사하지 않고 변경하지 않은 것들을 선택해서 원하는 것만 복사하고 싶을 때에도 사용하면 좋습니다. 사용방법 copyProperties(Object source, Object target) source - 원본 객체 target..

JVM/Spring

[SPRING] lombok 활용

Lombok 이란 ❓❓ 자바 Model(DTO, VO, Domain)에서 반복적으로 만들어야하는 것들을(Getter/Setter...) 어노테이션을 통해 코드의 줄을 줄여주고, 가독성을 높이는 데에 굉장한 도움을 주는 라이브러리 입니다. 간단한 예제를 먼저 보여드리겠습니다. Getter / Setter 기존방식 경우 위처럼 객체를 사용하기 위해 배가 되는 줄을 반복적으로 만들어야하는 일이 빈번히 발생하곤 합니다. 위처럼 getter와 setter를 비롯하여 toString, Builder 등을 더 만들게 되면 더 많은 줄이 생기게 될 것입니다. 이를 매우 간편하게 줄여주는 도구가 lombok입니다. 위처럼 불필요한 줄들을 줄여 가독성면을 높이게 됩니다. 오른 쪽 면을 보시면 getter와 setter가 ..

Hyo Kim
'Spring' 태그의 글 목록 (2 Page)