전체 글90 톰캣의 구조와 Connector 설정 값 Tomcat의 구조 Server: tomcat의 최상위 인터페이스로 전체 컨테이너를 표현한다. Service: Server 안에 존재하며 Connector와 Engine을 연결해준다. Engine: 실제 요청을 처리하는 역할을 담당한다. Connector를 통해 요청을 받아 이를 처리한 후 응답을 보낸다. Host: 네트워크 이름을 나타낸다. Connector: 클라이언트와의 커뮤니케이션을 담당한다(이름 그대로 Connection을 처리한다). Context: Web application을 표현한다. 톰캣 튜닝을 할 때 우리가 주로 살펴볼 곳은 Connector이다. Connector의 주요 역할은 브라우저로부터 TCP 커넥션을 받아 Request, Response 객체를 생성하여 쓰레드가 이를 처리할 .. 2022. 9. 11. deleteAllByIdInBatch는 영속성 컨텍스트를 동기화하지 않는다 (feat.문서를 잘 읽자…) delete 관련 기능을 개발하다가 trouble shooting(?)한 경험을 간단히 공유합니다. JpaRepository의 deleteAllByIdInBatch 메서드를 사용하는 서비스 코드를 테스트하는 과정에서, 분명 delete 쿼리가 로그에 찍히는데 findById로 조회를 하면 데이터가 남아있는 문제가 있었습니다. 이해하기 쉽게 예시를 다시 구성해보면 @Test void Space삭제() { Host host = hostRepository.save(Host_생성("1234")); Space space = spaceRepository.save(Space_생성(host, "잠실 캠퍼스")); Job job1 = jobRepository.save(Job_생성(space, "청소")); Job job.. 2022. 7. 18. Singleton Scope 빈에 Request Scope 빈을 주입받고 싶다면… (Scoped Proxy Bean) 문제 상황 프로젝트 도중 singleton scope 빈에 request scope을 주입해서 사용해야 할 상황이 생겼다. 아래와 같이 인가 처리를 위한 커스텀 인터셉터에서 인증 정보를 담아두는 객체를 주입받아 사용해야 했기 때문이다. @Component public class AuthenticationInterceptor implements HandlerInterceptor { private final AuthenticationContext authenticationContext; ... @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Excep.. 2022. 7. 13. [MySQL 8.0] 인덱스 조회 최적화 기능, Skip Scan에 대해 살펴보자 Real MySQL을 읽다가 재미있는 내용을 발견해서 한 번 정리해봤습니다. 인덱스의 핵심은 값이 정렬되어 있다는 것입니다. 다중 컬럼 인덱스는 첫 번째 칼럼에 의존하여 두 번째 칼럼이 정렬되기 때문에 칼럼의 순서가 매우 중요합니다. 예를 들어 mysql> ALTER TABLE employees ADD INDEX ix_gender_birthdate (gender, birth_date); 위와 같은 다중 컬럼 인덱스가 생성되어 있다면 birth_date 칼럼은 gender에 의존적입니다. 따라서 birth_date만을 조건으로 조회를 할 경우 인덱스를 활용하지 못합니다. 그런데 MySQL 8.0부터 skip scan 최적화 기능이 도입되면서, birth_date 조건만으로 인덱스를 활용할 수 있게 되었습니.. 2022. 6. 23. 3개월 간의 운동 후기 (03.16 ~ 06.18) 3월부터 집 주변 헬스장에서 운동을 하기 시작했다. 운동을 시작한 이유는 우아한테크코스 level 1 글쓰기 미션의 주제이기도 했다. 온라인으로 코스가 진행되면서 생활 패턴이 많이 무너졌었다. 매일 새벽 4시가 넘어서 잠들고, 데일리 미팅 시작 직전에 일어나는 생활을 반복했었다. 그러다 결국 늦잠 때문에 데일리 미팅에 지각을 했었다. 생활 패턴도 바꾸고 건강도 되찾고자 우테코 크루이자 동네 주민인 토르가 다니는 헬스장에 등록했다. 3개월 간의 성과를 먼저 말하자면, 근손실 없이 체지방만 4kg 걷어냈다. 체중: 86.2kg -> 82.6kg 골격근량: 35.6kg -> 35.8kg 체지방량: 24.1kg -> 20.1kg 운동을 시작하고 2주 정도 지나고 나서야 체성분 측정을 해서 조금 아쉽다. 운동을 .. 2022. 6. 18. AUTO_INCREMENT는 ROLLBACK되지 않는다 데이터 접근 객체 테스트 작성 중 다음과 같은 문제를 겪었습니다. @SpringBootTest @Transactional @ActiveProfiles("test") class ChessGameDAOTest { @Autowired private ChessGameDAO dao; ... @Test @DisplayName("체스 게임방을 ID로 불러온다") void findChessGameById() { // arrange String gameName = "test1"; dao.addGame(new GameCreationDTO(gameName, "123")); // act ChessGame findGame = dao.findGameById(1); // assert assertThat(findGame.getNam.. 2022. 4. 27. Type Erasure Deep Dive 제네릭에 사용되는 타입 소거(type erasure)에 대해 알아보고 이로 인해 생기는 제약과 문제들에 대해 탐구합니다. Type Erasure(타입 소거)란 제네릭 타입에 사용된 타입 정보를 컴파일 타임에만 사용하고 런타임에는 소거하는 것을 말한다. 타입 소거 규칙 자바 컴파일러는 아래의 규칙에 따라 타입 소거 과정을 실행한다. 모든 타입 파라미터를 그들의 바운드나 Object 타입으로 교체한다. 제네릭 타입을 제거한 후 타입이 일치하지 않으면 타입 캐스팅을 추가한다 확장된(extended) 제네릭 타입의 다형성을 보존하기 위해 브릿지 메서드를 생성한다. 예를들어 아래처럼 언바운드 타입 T로 제네릭 클래스를 선언하고 컴파일을 한 뒤 바이트코드를 까보면 타입 변수가 사라지고 Object 타입으로 바뀐 것.. 2022. 3. 6. [Spring] 스프링 이벤트를 활용하여 서비스 간의 의존성 제거하기 작년 12월 19일에 진행한 유스콘에서 스프링 이벤트 처리에 대한 세션이 있었는데요, 내용이 너무 좋아서 포스팅으로 정리하며 제대로 이해해보고자 합니다. 반태형님이 지식 공유를 해주셨고 예제 코드는 여기서 확인하실 수 있습니다. 스프링 공식 문서에서 이벤트에 관한 내용을 참고하고 싶으시면 여기를 보시면 됩니다. 애플리케이션을 만들다보면 아래처럼 서로 다른 서비스 간에 의존성이 발생하는 경우가 생깁니다. @Service public class UserService { private final UserRepository userRepository; private final AdminService adminService; private final EmailService emailService; private .. 2022. 2. 5. 우아한테크코스 4기 최종합격 후기 정말 감사하게도 우테코 4기에 합류할 수 있게 되었습니다. 최종 테스트와 합격 발표 사이 2주 정도 되는 시간 동안 마음이 붕 뜬 상태로 지냈습니다. 최종 합격 여부가 자꾸 신경 쓰여서 공부가 손에 잡히질 않더라고요. 개발 관련 공부가 아얘 집중이 안됐습니다. 여태 나름 멘탈이 강하다고 스스로를 평가했었는데… 그만큼 간절했나 봅니다. 최종 코딩 테스트를 치고 나서 든 느낌은 ‘나쁘지 않게 잘했다’였습니다. 비록 예외처리 하나를 빼먹긴 했지만 미션의 대부분의 요구사항을 구현했고, 코드도 결코 좋은 코드라고 할 순 없지만 그래도 미션의 프로그래밍 제약사항과 프리코스 기간의 피드백 사항에서 많이 벗어나지 않았다고 생각했기 때문입니다. 뭐 개인적인 감상 같은 건 차치하고 두 번의 프리코스 과정을 거치면서 느낀 .. 2022. 1. 7. 이전 1 2 3 4 ··· 10 다음