전체 글

서버는 꺼지지 않아요
우리가 SELECT 쿼리를 실행시킬 때, 해당 쿼리는 FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY 으로 나뉘어져 정해진 순서에 따라서 실행된다. 순서는 아래 그림과 다음과 같다. 1. FROM 먼저, FROM절을 바탕으로 데이터를 읽어올 테이블을 설정한다. 만약 FROM절에 JOIN이 포함되어있다면, 가상 테이블에 JOIN으로 합쳐진 데이터를 결합한다. 2. WHERE FROM절로 가져온 데이터에 대하여 WHERE절에 명시된 필터링을 실행한다. 3. GROUP BY 1, 2 단계를 거쳐 추출된 데이터들을 GROUP BY에 명시된 컬럼을 기준으로 그룹핑한다. 4. HAVING 그룹핑된 데이터에 대하여 HAVING절에 명시된 필터링을 실행한다. 주의점은 WHERE절과..
· 개발자취
서론 최근에 사내에서 실시한 기술 세미나 이른바 테코톡에서 테스트 코드를 주제로 발표를 하게되었다. 언제부턴가 테스트 코드가 없으면 불안함을 많이 느끼는 터라 테스트를 잘 짜기 위해선 무엇이 중요할지, 테스트 코드가 가져올 수 있는 긍정적인 영향은 무엇일지에 대해 많은 고민을 해왔었다. 그 과정에서 테스트 코드 리팩토링을 통해 속도, 메모리 등과 관련해 테스트 환경도 개선해보고, 테스트 커버리지 100% 적용, ATDD 등 다양한 경험을 해볼 수 있었다. 하지만 그렇다보니 준비 과정에서 오히려 하고 싶은 말이 너무 많아져서 발표 주제의 방향성이 모호해지는 걸 느꼈다. 그러다가 2023 인프콘에서 이민우님께서 발표하신 "인프런에서는 수천 개의 테스트 코드를 이렇게 다루고 있어요"를 보고 깊은 인상을 받아서..
· 웹/Spring
WireMock? WireMock is a library for stubbing and mocking web services. It constructs an HTTP server that we can connect to as we would to an actual web service. When a WireMock server is in action, we can set up expectations, call the service and then verify its behaviors. https://www.baeldung.com/introduction-to-wiremock WireMock은 Mock API를 구축해주는 라이브러리로써, 외부 API와 통신을 하는 애플리케이션 코드를 테스트하기 위해 주로 ..
문제 상황 사내 프로젝트의 스프링 부트 및 자바 버전을 업데이트하면서 Deprecated된 클래스들 또한 새롭게 업데이트하고 있었다. 그 중, Spring Security의 WebSecurityConfigurerAdpater가 스프링 부트 2.7 버전부터 Deprecated 되었고 이를 대신해 SecurityFilterChain을 사용하도록 권고했다. 교체하는 것 자체는 어렵지 않았다. 기존 WebSecurityConfigurerAdpater를 상속하는 것 대신 SecurityFilterChain 빈을 등록해주면 되는 형태였다. // 기존 @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override p..
· 개발자취
서론 사내 프로젝트에서 새로운 API를 추가한 후, MockMvc를 통해 통합 테스트를 하는 과정에서 계속해서 오류가 발생했다. 테스트 코드 로그를 통해 자세한 오류를 확인한 결과, 요청이 엉뚱한 RequestHandler에게 가고 있었다. 예컨대, 아래와 같이 API가 정의되어있다고 가정해보자. @RestController public class OrderController { @RequestMapping(method = RequestMethod.GET, value = "/orders/{no}", produces = "application/json") public long getOrder(@PathVariable long no) { ... } // 새로 추가 @RequestMapping(method =..
문제상황 실서버에서 Deadlock이 발생했다는 리포트가 올라왔다. Deadlock found when trying to get lock; try restarting transaction 로그를 확인해보니 1초 이내의 짧은 시간 동안 동일한 벌크성 POST 요청이 두 번 연속으로 들어왔다. 아마 우리 서버를 사용 중인 모바일 UI상에서 따닥 두 번 클릭을 한 모양이다. 원인 분석 코드단에서 먼저 분석했을 때, 데드락을 유발한 코드는 아래와 같았다. public void updateMailboxId(String mailboxIdToUpdate, List mailNoList) { jpaQueryFactory.update(mail) .set(mail.mailbox.id, mailboxIdToUpdate) .w..
· 개발자취
https://seongonion.tistory.com/145 생애 첫 오픈소스 컨트리뷰트 도전기 (1) https://seongonion.tistory.com/144 Java Mail API의 SharedFileInputStream 오류(로 추정되는 것) 수정해보기 SharedFileInputStream? A SharedFileInputStream is a BufferedInputStream that buffers data from the file and supports the mark and reset m seongonion.tistory.com 위 글과 이어지는 내용입니다. 테스트 코드를 추가하고 얼마 후, 리뷰를 해주던 jmehrens가 갑자기 살짝 갸우뚱한 얘기를 했다. 대략적으로 해석해보자면,..
· 개발자취
https://seongonion.tistory.com/144 Java Mail API의 SharedFileInputStream 오류(로 추정되는 것) 수정해보기 SharedFileInputStream? A SharedFileInputStream is a BufferedInputStream that buffers data from the file and supports the mark and reset methods. It also supports the newStream method that allows you to create other streams that represent subsets of the fil seongonion.tistory.com 위 수정사항을 Java Mail API에 PR로 ..
SeongOnion
조무래기 코딩