JVM

JVM/Java

[Java] HashMap. stream으로 sum하기

😎서론 이번 HashMap에서 sum을 해야하는 상황이 생겨서 분명 get으로 꺼내서 하나씩 sum하는 것 말고 stream으로 하는 방법이 있을 것 같아서 찾아봐서 기록한다. 😋본론 mapToInt와 reduce 방식 두 가지를 보게 되었는데 reduce가 개인적으로 더 깔끔해보여서 자주 사용하게 될 것 같다. public static int getSum(final Map data) { return data.values().stream().mapToInt(Integer::intValue).sum(); } public static int getSum(final Map data) { return data.values().stream().reduce(0, Integer::sum); } 역시.. 항상 '이런거..

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/Spring

[SPRING] AOP 우선순위 설정하기.

🤔서론 AOP에 대해서 공부하다가 만약 AOP가 두 개 이상이 적용되면 순서는 어떡하지란 생각이 들었다. 😃본론 순서적용 되기 전 위와 같은 AOP를 두개를 만들었다. 호출결과 어째서 이 순서대로 나왔는지는 잘 이해하지 못하겠다.. 아마 직접만든 AOP들의 순서를 Spring에서 지정해주는대로 아무렇게나 되길 원하는 개발잔 없을거다. 그러므로, 직접 순서를 정해주자! 순서적용 후 호출결과 Order 숫자가 작을수록 먼저 실행되고, 큰 수가 뒤에 실행된다. => 오더숫자가 클 수록 먼저 감싸진다. 이렇게 @Order(value = ?) 설정을 통해 내가 원하는대로 AOP 감싸는 순서를 정할 수 있다.

JVM/Spring

[SPRING] @Transactional (트랜잭션) 강제 롤백

😎본론 로직을 구현하다가 아래와 같은 상황을 마주한 적이 있었다. 트랜잭션 내에서 쿼리작업을 진행하다가 validation을 통해 걸렸을 때 에러는 발생하지 않고, 지금까지 변경된 쿼리를 롤백을 시켜야 할 떄 @Transactional 은 Exception 이 발동할 때만 롤백을 시킨다. 🤔그러면 어떻게 롤백을 시켜야할까? TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 트랜잭션이 롤백하는 방법을 강제적으로 넣어주는 것이다. setRollbackOnly 을 통해 트랜잭션이 종료되었을 때 무조건 롤백을 시키도록 설정하는 것이다. 물론 해당 로직은 리팩토링 작업을 통해 validation과 쿼리작업을 분리하였다. 당장 테스트를 해..

JVM/Spring

[SPRING] Spring AOP Proxy - @Transactonal 사용 시 주의사항

😅서론 상속받은 클래스 내에 @Transactonal 이 걸려있는 삭제 메소드가 트랜잭션이 발동을 안 하는 버그를 발견했다. 같은 클래스 내에서 프록시가 발동하지 않는다는 것은 알고 있었지만, 막상 겪으니 다른 클래스인데 뭐가 문제지..? 란 생각에 빠져서 찾는 대에 시간을 좀 사용했다.. 그 김에 작성.. 😁본론 스프링은 AOP를 하기위해 기본적으로 디자인패턴인 프록시패턴을 채택하여 사용하고 있다. AOP(Aspect Oriented Programming) 관점지향 프로그래밍이라는 뜻으로 여러 곳에서 사용되는 공통된 로직을 모듈화하여 비즈니스 로직에서 분리시켜준다. 이로써 우리는 비즈니스 로직 외에 부가적인 로직은 따로 외부에서 관리하여 유지보수 및 재사용성이 용이해진다. 프록시(Proxy) 스프링의 ..

JVM/Java

[JAVA+MSSQL]드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. - 오류 해결방법

😢서론 DB : MSSQL JDK : zulu 11 version OpenJDK 11버전으로 올린 후 기존 MsSql을 진행하던 프로젝트에서 아래와 같은 에러가 발생했다. Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 오류: "The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]". 😎본론 🤔원인 TLS(Transport Layer Security) 전송계층보안 이라는 암호화 보안 프로토콜은 데이터 전..

JVM/Java

[Java] 객체[Object] List 중복된 ID 목록만 뽑기(추출)

😅서론 알고리즘 문제 때문인가 객체, 리스트, 배열 중복에 관련해서는 대부분 중복 값을 제거하는 설명이 대부분이었다. 가끔가다 중복 값 개수 세기 정도는 있지만 중복 목록만을 뽑는 글은 안 보여서 ... (구글링이 부족할지도) 시작! 😎본론 0. 시나리오 UserList를 받아 저장시킬 때 해당 List 내에 중복된 ID 목록을 return 시켜줘야 한다. 내가 필요한건 객체 내에 중복된 ID를 찾는 것. 00. 객체정보 aaa - 3번 / bbb - 3번 / ccc - 2번 / ddd - 1번 / eee - 1번 1. 스트림(Stream)과 Set을 사용하기 - 스트림을 통해 userId 목록만을 가져온다. - 새로만든 List 목록을 for문을 돌린다. - 아이디마다 indexOf와 lastIndex..

Hyo Kim
'JVM' 카테고리의 글 목록 (6 Page)