본문 바로가기

전체 글81

Transactional 정리 Q. 스프링 프레임워크에서는 트랜잭션을 처리할 때 @Trasnactional 을 사용하는데, 이 @Transactional 어노테이션에는 7가지 전파 방법이 있다, 어떤 것들이 있는가? A. @Transactional 어노테이션을 사용하면 적용된 클래스 또는 메소드에 트랜잭션이 적용된다. 따라서 클래스에 할 것인지, 메소드에 할 것인지 판단을 잘 해야 한다. 7가지 Propagation(전파) 방법은 REQUIRED : 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성한다. REQUIREDS_NEW : 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성된다. SUPPORT : 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 nontransactionally 로 .. 2022. 7. 14.
JPA 락에 대해 트랜잭션에 대해서 이야기 하다보면은 항상 나오는 얘기가 있는 것 같습니다. 대량의 트래픽이 한 번에 들어왔을 때 어떻게 줄을 세울 것인가? 물론 아닐 수도 있지만, 면접때는 거의 항상 비슷한 내용을 물어봤던 것 같습니다 여러 방법이 있을 것 같습니다. DB 의 isolation level 을 조정한다던가 (하지만, 심각하게 느려지므로 비추인 것 같습니다.) JPA 의 낙/비관적 락을 사용한다던가 레디스를 통해 받는다던가 (클러스터를 사용하면 zookeeper 를 사용해야 한다던가 하는데, 자세히는 모르겠네요.) 알아본 혹은 알고 있는 방법으로는 3가지 정도가 있는 것 같습니다. 이번엔 JPA 의 락에 대해서 알아보려고 합니다. 1. 락 없이 동시 접근을 했을 때 동일한 데이터에 접근하여 수정하는 예로는 .. 2022. 7. 14.
Mockito 정리 (1) Mockito 란? 자바에서 단위 테스트를 위한 Mocking framework tastes really good(?!) (개인적으론) 간편하게 사용할 수 있어서 테스트코드 작성할 때 즐겨 사용하는 편입니다. 1. 의존성 추가 org.mockito mockito-core 3.0.0 test 버전에 대해 mockito 의 버전은 1.x, 2.x, 3.x 로 총 3개가 있습니다. 공식 wiki 에 따르면 1과 2는 맞지 않는(Incompatible) 것도 있다고 합니다. 2와 3은 API 로는 변경된 것이 없으나, Java8 에 맞춰졌다고 합니다. 2. 사용 방법 2-1. verify // mock 등의 코드를 깔끔하게 하기 위해 static import import static org.mockito.Moc.. 2022. 7. 14.
멀티쓰레드에서 Thread-Safe 방법 1. 멀티 쓰레드(Multi Thread)란? 1-1) 정의 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고, 자원의 생성과 관리의 중복성으 최소화하여 수행능력을 향상시키는 것 하나의 프로그램에 동시에 여러개의 일을 수행할 수 있도록 해주는 것 1-2) 멀티 프로세스와의 차이점 멀티 프로세스 : [데이터, 힙, 스택] 영역 모두 비공유 멀티 쓰레드 : [데이터, 힙, 스택] 영역 중 스택만 비공유 2. 쓰레드 세이프 방법 쓰레드를 사용하는 환경에서 성능을 높이기 위해서 멀티 쓰레드를 사용하지만, 힙과 데이터영역은 공유하기 때문에 쓰레드 간에 safe 하지 못하게 됩니다. 1) Synchronized private Integer count = 0; synchronized (count) { c.. 2022. 7. 14.
orElse 와 orElseGet 무슨 차이가 있을까? Java 8을 쓰면서 null 에 대한 처리를 위해서 Optional 을 많이 쓸 텐데요. 저도 꽤 즐겨 쓰는 편입니다. (보통 null 을 반환하는 로직을 짜고 싶지 않겠지만, 그게 항상 마음대로 되지는 않잖아요..) 또한 적절하게 쓰면 코드 길이를 줄여 한 줄로 가능하다는 장점도 있고요. Optional 에는 orElse() 라는 메소드와 orElseGet() 이라는 메소드가 있는데요. 둘 다 Optional 을 통해 가져온 값이 null 일 때는 해당 값을 반환하라는 메소드 입니다. 최근에 관련 메소드를 쓰다가 전혀 생각지도 못한 곳에서 에러가 나서 재배포를 한 기억이 있는데요. (핫픽스를 통해 재배포를 했습니다. 하하..) 그러면 좀 더 잘 알고 사용하여, 다음엔 같은 에러를 발생시키지 않도록 정.. 2022. 7. 14.
SimpleJdbcInsert 문제 이전 jdbcTemplate 를 설명하면서 simpleJdbcInsert 에 대한 칭찬(?)을 했었다. @Override public Long saveLoginUI(final LoginVO loginVO) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(final Connection connection) throws SQLException { PreparedStatement statement = connection.prepareStatement("insert into.. 2022. 7. 14.