들어가기 전 조회수는 별거 아닌 기능인 것처럼 생각되지만, 이번에 구현해보려고 할 때 정말 어려운 작업이라는 것을 느꼈다. 특히 다음 관점에서 어렵다. 아래에서는 여러 버전을 구현하고 테스트 하면서 결론을 하나씩 정리해보고자 한다. 동시성 문제 실시간 반영성 문제 정확성 문제 요구 사항 가능한 실시간으로 업데이트 되어야 함. 한 명이 하나의 가게를 하루에 여러 번 조회해도 가게의 조회수는 단 한 번만 증가해야 함. 조회수 기능이 동작하지 않더라도 어플리케이션은 동작해야 함. 내가 구현한 조회수 기능의 요구 사항은 다음과 같다. 결과 검증 코드 많은 요청이 동시에 들어왔을 때 발생할 수 있는 동시성 문제 / 성능 문제를 확인하기 위해 아래 파이썬 코드를 이용했다. aiohttp와 asyncio를 이용해 비..
Spring Tomcat Thread Pool 스프링 MVC는 내장 톰캣을 사용하고, 요청마다 새로운 쓰레드가 배정된다. Tomcat 서버에서는 쓰레드 생성 비용을 절감하기 위해 쓰레드 풀에 미리 생성되어 있는 쓰레드를 재활용한다. 톰캣 서버와 관련된 설정값을 바꿔서 이런 부분들 조절할 수 있다. server: tomcat: threads: max: 200 min-spare: 50 accept-count: 10 max-connections: 1000 각각이 의미하는 것은 다음과 같다. max : 톰캣 쓰레드풀이 동시에 사용할 수 있는 최대 쓰레드 개수. 쓰레드 개수만큼 동시 요청 처리가 가능함 min-spare : 톰캣 쓰레드풀에 대기 상태로 있는 쓰레드 개수. max-connections : 톰캣 커넥..
Spring : 동일 타입 여러 스프링 빈 주입 받기 OCP를 지키기 위한 수단 중 하나로 인터페이스를 도입한다. 인터페이스를 도입하면 객체 사이의 결합이 낮춰진다는 장점이 있다. 그런데 이것은 동일한 인터페이스를 갖지만 서로 다른 구현체를 가지는 스프링 빈을 여러 개 등록하고 사용할 때는 꽤 귀찮은 상황이 될 수도 있다. 스프링은 기본적으로 타입을 보고 스프링 빈을 주입해준다. 동일한 타입의 스프링 빈이 여러가지 존재한다면 필드의 이름과 스프링 빈의 이름이 일치하는 것을 넣어준다. 그래도 잘 안된다면 ObjectProvider 등을 이용해서 넣는 방법이 있다. 이 때 필드의 이름을 직접 지정하거나, ObjectProvider에 이름을 직접 지정해야하기 때문에 하드코딩에 조금쯤은 가까운 방법이 되기도 한..
들어가기 전 이 글은 인프런 영한님의 강의를 복습하며 작성한 글입니다. 스프링 트랜잭션 전파 이 글에서는 다음 목표를 가진다. 스프링에서 트랜잭션이 두 개 이상 존재할 때, 어떻게 동작하는지 확인. 스프링이 제공하는 트랜잭션 전파 개념 숙지 스프링 트랜잭션 전파1 - 커밋, 롤백 코드는 이곳(https://github.com/chickenchickenlove/springdb2/blob/chapter-9-spring-transaction-propagation-basic/src/test/java/hello/springtx/propagation/BasicTxTest.java)에서 확인할 수 있음. 먼저 1개의 트랜잭션만 있을 때, 트랜잭션을 각각 커밋하고 롤백하면 어떤 결과가 나오는지를 확인해보고자 한다. 아..
들어가기 전 이 글은 인프런 영한님의 강의를 복습하며 작성한 글입니다. 스프링 트랜잭션 추상화 스프링은 다양한 데이터 접근 기술을 지원한다. 다양한 데이터 접근 기술은 저마다 서로 다른 방식으로 트랜잭션을 사용하고 있었다. 아래에서 JPA와 JdbcTemplate의 트랜잭션 사용 코드를 볼 수 있다. // JdbcTemplate public void accountTransfer(String fromId, String toId, int money) throws SQLException { Connection con = dataSource.getConnection(); try { con.setAutoCommit(false); //트랜잭션 시작 //비즈니스 로직 bizLogic(con, fromId, toId,..