Back-end/Spring
[Spring Websocket] In Memory Broker vs External Broker
🔍 Message Broker란? Publisher로부터 전달받은 메세지를 Subscriber로 전달해줄 때 중간에서 메세지를 주고 받게 해주는 중간 역할 🔍 In Memory Broker란? Spring websocket에서 STOMP 프로토콜을 사용해서 웹소켓 기능을 구현할 때 STOMP는 Message Broker가 필요하다. 이 때 아무 설정 없이 Spring 환경에서 STOMP 프로토콜을 사용한다면 메세지 브로커로 In Memory Broker를 사용하게 된다. 그렇다면 하나의 서비스를 만들 때 In Memory Broker를 메세지 브로커로 사용해도 상관 없을까? 상관있다... 아래를 보면, In Memory 브로커의 단점들이 존재한다. 세션을 수용할 수 있는 크기가 제한되어 있다. 장애 발생..
[Spring Websocket] STOMP - convertAndSendToUser 사용법
STOMP란? 문자 기반의 송수신을 위한 문자 기반 메세징 프로토콜 convertAndSendToUser() 채널에 구독하고 있는 사용자들 중 모두에게가 아닌 특정한 사용자에게 메세지를 보낼 수 있도록 해주는 메소드 convertAndSendToUser(String user, String destination, Object payload) 이때 convertAndSend와 같이 두 번째와 세 번째 파라미터에는 채널과 보낼 데이터를 넣어야 하는 것을 알 수 있다. 그러나 처음에 convertAndSendToUser를 사용하면서 첫 번째 파라미터인 user에는 무엇이 들어가야 할지를 알 수 없었다. 파라미터 처음에는 username을 입력해주면 되지 않을까 싶었다. 그러나 다시 생각해보니 username은 ..
[Spring] 간단하게 HTTP POST 요청하기
💡 POST 요청이란? 서버에 요청하는 방식 클라이언트가 서버에 요청을 할 때 제공해야하는 자원이 있을 때 Get방식은 요청하는 자원을 URL에 뒤에 보내는 반면 POST방식은 URL에 붙이지 않고 따로 데이터(Body)를 만들어 보낸다. 🔍 Spring Framework에서 POST 요청 하기 1. Body 만들기 Body는 보통 key, value의 쌍으로 이루어지기 때문에 자바에서 제공해주는 MultiValueMap 타입을 사용해야한다. MultiValueMap params = new LinkedMultiValueMap(); params.add('') MultiValueMap 타입으로 만들어준 변수에 add()를 사용해 보낼 데이터를 추가해준다. 2. Header 만들기 HTTP POST를 요청할때..
[Spring] 트랜잭션 문제 해결 - 트랜잭션 동기화 기법
🧐 트랜잭션 동기화 기법이란? 트랜잭션을 시작하기 위해 만든 Connection 오브젝트를 특별한 저장소에 보관하면서, 호출되는 DAO의 메소드에서 앞서 저장된 Connection을 가져다 사용하는 기법. 즉, 하나의 트랜잭션을 동기화 방식을 통해 이 사이에 실행된 메소드들은 동기화된 트랜잭션을 사용하게 하는 기법. UserService의 트랜잭션 원자성 문제를 해결하기 위해 트랜잭션 동기화 기법을 사용해 해결해보자 스프링은 트랜잭션 동기화 관리 클래스인 TransactionSynchronizationManager를 제공해준다. 따라서 위 클래스의 메소드들을 통해 동기화를 해보자. TransactionSynchronizationManager 메소드들 👉 initSynchronization : 트랜잭션 동..
[Spring] 트랜잭션 문제 찾기 (feat. 트랜잭션 경계설정 구조)
🧐 레벨 업그레이드 기능을 구현했을 때, 업그레이드 변경 과정 중에 에러가 발생한다면? 에러가 나기 전까지 유저들은 업그레이드가 될까? 한번 일부로 업그레이드 과정 중에 에러를 발생시켜 강제적인 상황을 만들어 확인해보자! @Test public void upgradeAllOrNothing() { UserService testUserService = new TestUserService(users.get(3).getId()); testUserService.setUserDao(this.userDao); userDao.deleteAll(); for(User user : users) userDao.add(user); try { testUserService.upgradeLevels(0); fail("TestUser..
[Spring] 리팩토링 해보기 (feat. 객체지향적인 관점)
💡 리팩토링이란? 리팩터링(refactoring)은 소프트웨어 공학에서 '결과의 변경 없이 코드의 구조를 재조정함'을 뜻한다. 주로 가독성을 높이고 유지보수를 편하게 한다. 버그를 없애거나 새로운 기능을 추가하는 행위는 아니다. 사용자가 보는 외부 화면은 그대로 두면서 내부 논리나 구조를 바꾸고 개선하는 유지보수 행위이다. ✏️ 리팩토링 전 코드 점검 항목 코드에 중복된 부분은 없는가? 코드가 무엇을 하는 것인지 이해하기 불편하지 않은가? 코드가 자신이 있어야 할 자리에 있는가? 앞으로 변경이 일어난다면 어떤 것이 있을 수 있고, 그 변화에 쉽게 대응할 수 있게 작성되어 있는가? ✏️ UserService를 리팩토링 해보자 각 User마다 갖고 있는 level을 login, recommend를 검사해 기..