목록Spring (17)
영호
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ondRq/btsyuEoVx52/hvltUEfqWGRsjrIsRnoNwk/img.jpg)
들어가면서 이번 글에서는 @Transactional 이 커밋되는 과정을 물리 트랜잭션, 논리 트랜잭션 2 경우에 대해 디버깅을 통해 공부한 과정을 정리할 예정이다. 스프링 트랜잭션에는 물리 트랜잭션과 논리 트랜잭션이란 개념이 있다. 물리 트랜잭션은 데이터베이스 커넥션을 통해 우리의 쿼리가 실제 커넥션을 통해 커밋/롤백 하는 역할을 한다. 논리 트랜잭션은 A라는 트랜잭션에 B 라는 트랜잭션이 참가하는 경우. 즉, 하나의 트랜잭션 내부에 다른 트랜잭션이 추가로 사용하는 경우 이 트랜잭션들을 논리 트랜잭션 이라고 한다. 트랜잭션이 하나라면 물리, 논리 트랜잭션을 구분하지 않는다. 트랜잭션의 COMMIT 동작 흐름 @TransactIonal 을 활용한 트랜잭션은 AbstractPlatformTransaction..
들어가면서, 우테코 5기 프로젝트를 진행하면서 처음 빌더 패턴을 써봤다. 그 과정에서 하나의 객체에 대해 2가지 버전의 Builder 를 활용할 필요성이 있었는데 겪은 문제점과 해결 방법에 대해서 작성할 예정이다. 문제 상황 회원은 2가지 종류가 있다. 임시 회원 정식 회원 임시회원은 전화번호만 필요하고, 정식 회원은 현재 OAuth를 활용하기 때문에 OAuthProvider, OAuthId 가 필요하다. 추가적으로 임시회원은 임시 닉네임으로 전화번호 마지막 4자리를 사용하기 때문에 임시회원만 전화번호를 이용해 닉네임을 생성하는 작업이 필요하다. 그래서 내가 원한 것은 내가 원한 기능 Customer 객체에 회원 종류 별 Builder 메서드를 이용해 각 회원 객체를 생성할 때 개발자의 실수를 줄이고, ..
잘못된 내용이 있으면 언제든지 피드백 해주시면 감사하겠습니다 ^.^ Context Caching? Spring에서 테스트를 작성할 때 bean으로 등록한 것들을 테스트하기 위해선 Application context가 필요하다. 하지만 테스트의 독립성을 유지하기 위해 테스트마다 모든 bean으로 구성된 Application context를 만든다면 속도가 매우 느릴것입니다. 그래서 spring의 testContext는 context caching을 해줍니다. 그렇다면 어떤 기준으로 context caching하는지 알아보겠습니다. 언제 새로운 context를 만들지? 기본적으로 textContext는 재사용할 수 있다면 이미 만들어진 context를 caching해 재사용합니다. 그렇다면 언제 재사용을 할..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dOqWpf/btsb1Qq4Qfz/paT3GntgXJO4xf2eMl9bgk/img.png)
개요 레벨2 자동차 경주 미션을 진행하면서 201응답을 반환하는 상황이 있었다. 이 과정에서 ResponseEntity의 created는 왜 URI를 인자로 받는지 페어와 이야기 했었다. 당시에 추측만 하고 명확하게 답을 내지 못해서 따로 공부한 내용을 정리해보려고 한다. ResponseEntity.created(URI)구현코드 public static BodyBuilder created(URI location) { return status(HttpStatus.CREATED).location(location); } ResponseEntity클래스의 created메서드는 위와 같이 구현되어 있다. parameter에 URI가 있다. 도대체 저 URI가 뭐지? 당시 디투와 얘기 했을 때는 redirect를 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/QtcMg/btsbqAWDKQI/nY8nqIz8eoRQHWCdvD11rK/img.png)
개요 Spring의 IoC container를 알아보기 위해 아래와 같은 개념들에 대해 정리한다. IoC란? Spring에서 IoC를 제공하기 위한 인터페이스 IoC컨테이너 안에서 bean을 관리하는 생명주기 IoC(Inversion of control) 위 단어를 해석하면 ‘제어의 역전’이다. 나는 여기서 제어라는 것은 의존성 관리를 의미한다고 생각한다. 객체지향 프로그래밍은 다양한 객체를 생성하고 객체끼리의 의존성을 관리하면서 객체를 사용하는 코드를 작성해 서비스를 구성한다. 만약 A객체에서 B객체의 기능을 사용할 필요가 있어서 A클래스 내부에서 B객체를 생성하는 코드를 작성하게 되면 A와 B는 강하게 결합된다. class ServiceA { public void doSomething() { } } ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cqe2XB/btsblzkxZ5m/GYU3bud7ihf7uLtPrk35bK/img.png)
기존 JDBC의 문제점 반복 코드가 너무 많다. 여기서 반복하는 작업은 아래와 같다. DB연결을 위한 자원 명시하기 파라미터 바인딩 마지막에 자원 반납하기 이 부분은 try with resource로 어느정도 해결이 가능하다. 결과 바인딩 JDBC는 아래 코드 처럼 디비 연결, 파라미터 바인딩, 결과 변환 등등을 다른 쿼리를 날리는 메서드에서도 반복해야 한다. public List findAllGameRooms() { String selectQuery = "SELECT game_room_id, status FROM game_room"; try (Connection connection = dbConnection.getConnection()) { PreparedStatement preparedStatemen..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/vNS1q/btr9CJg8o3o/MiXGKPTkMGTYWQNJVevMAk/img.png)
SimpleJdbcInsert란 기존 JdbcTemplate를 이용한 Insert보다 손쉽게 데이터를 저장하기 위해 제공하는 구현체다. 데이터 저장 후 primaryKey를 알고 싶은 경우 SimpleJdbcInsert를 이용해 keyHolder없이 구현할 수 있다. SimpleJdbcInsert와 JdbcTemplate제공 기능 차이 SimpleJdbcInsert SimpleJdbcInsert는 데이터를 저장하기 위한 기능만 제공하기 위해 SimpleJdbcInsertOperations를 구현하고 있다. execute() executeAndReturnKey() withTableName() 등등... JdbcTemplate JdbcTemplate은 데이터 저장뿐만 아니라 조회, 삭제, 업데이트 등의 기능..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bEP3R3/btrUInzxw2b/lKW8fRwT8KeTVRqrzBs53K/img.png)
우선 Spring의 특징 Spring은 객체지향의 장점을 살릴 수 있도록 도와줍니다. 객체지향 프레임워크는 객체들의 집합으로 객체들 간의 협력을 통해 기능을 완성시키기 때문에, 객체 간 의존관계를 잘 관리해야 합니다. 그렇다면, Spring에서는 어떤 식으로 객체들을 관리하는지 알아보겠습니다. 우선, Spring에서는 이러한 객체들을 빈(bean)이라는 개념으로 표현합니다. 스프링 컨테이너에 빈들을 등록하고 관리하는 방식입니다. 빈을 등록하는 방법에는 @Bean, 컴포넌트 스캔을 활용하는 방법 2가지가 있습니다. 이 2가지 방법을 비교해 보겠습니다. @Bean @Configuration public class ApplicationConfig { @Bean public ARepo aRepo() { retu..