본문 바로가기

반응형

스프링

(24)
[Spring] 객체 지향 설계 SOLID 개념과 적용 예시 참고 1. 스프링 핵심 원리 강의(김영한) 2. https://inpa.tistory.com/entry/OOP-%F0%9F%92%A0-%EC%95%84%EC%A3%BC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-ISP-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B6%84%EB%A6%AC-%EC%9B%90%EC%B9%99?category=967430 SOLID 클린 코드의 저자(로버트 마틴)의 객체 지향 설계 원칙 5가지 SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open-Closed Principle): 개방-폐쇄 원칙 LSP(Liskov Substitu..
스프링 - WebSocket SockJS(스프링) WebSocket Stomp WebSocket을 지원하지 않는 경우를 위해 SockJS라는 소켓 에뮬레이터를 이용해 Http의 다른 기술을 사용한다. SockJS는 스프링을 지원한다. -> 스프링 사용시 SockJS 이용 Stomp는 이들과는 별개로, Pub/Sub 구조의 소켓 통신을 위해 사용한다. TextWebSocketHandler (인터페이스) 텍스트 기반 웹 소켓 핸들러. (이미지나 영상 기반 웹 소켓 핸들러 => BinaryWebSocketHandler) afterConnectionEstablished : 커넥션이 연결될 때, 실행하는 부분 handleTextMessage : 소켓 서버가 메시지를 받았을 때, 실행 afterConnectionClosed : 커넥션이 끊겼을..
[WAS] 쓰레드 풀 요청이 오면, 서블릿 컨테이너에서 요청에 맞는 서블릿을 연결시켜줘야 한다. 이때, 연결은 쓰레드 단위로 수행한다. 즉, WAS는 요청마다 쓰레드를 생성 해, 요청에 맞는 서블릿은 연결시켜준다. 이떄의 장단점은 아래와 같다. 장점 요청마다 쓰레드를 생성해 연결하니까, 동시 요청 처리 가능 자원의 한계까지 처리 가능 하나의 쓰레드가 지연되도, 나머지 쓰레드들은 정상 수행 단점 쓰레드 생성 비용은 매우 비싸고, 큰 문맥 교환 비용이 발생 ➡️ 응답 속도 성능 🔽 쓰레드의 생성에는 제한이 없다 ➡️ 많은 요청이 들어오면, 쓰레드를 계속 생성하다, 과부하로 서버가 죽는다. 쓰레드 풀 WAS에서 일정 수만큼의 쓰레드를 미리 만들어서(톰캣의 Default는 200개), 쓰레드 풀에 넣어놓고 사용한다. 즉, 쓰레드를 ..
[Query DSL] Query DSL 왜 쓸까? Query DSL을 배우기 전, '왜 쓸까?'에 대해 정리 JPA에서 JPQL을 작성할 때 많은 불편함이 있었다. em.createQuery( "select new Project.repository.itemQueryDto(i.id, x.name, ..)" + " from Item i" + " join i.xx x" + ... , ItemQueryDto.class) 컴파일 단계에서 에러를 못 찾음 위 처럼, 문자열을 하나하나 이어 만들어 쿼리문을 짜야하기 때문에 잘못 작성할 경우, 컴파일러 단계에서 에러를 발견할 수 없다. 가독성이 안좋다. 한눈에 보기에도 코드가 잘 안읽힌다. (위 예시는 짧지만, 쿼리문이 더 길어질 경우 정말 보기 힘들다.) 특히, 저 "new Project...()"와 같은 부분이 많..
동시 요청 문제 - ConcurrentHashMap 참고 출처: https://www.youtube.com/watch?v=Ejw0GQLI9z8 Concurrent 클래스 - Concurrent 예시 : ConcurrentHashMap, ConcurrentMap, ConcurrentLinkedQueue 등 - 멀티 쓰레드 환경에서, 쓰레드로 부터 안전하게 관리. (쓰레드 안전한 객체 보장) ➡️ 멀티 쓰레드 환경에선 Concurrent를 자주 사용하는 경우가 많음. - 보통 Concurrent 뒤에 붙은 자료구조 Interface의 구현체. (ConcurrentHashMap ➡️ Map 인터페이스의 구현체 / ConcurrentLinkedQueue ➡️ Queue 인터페이스의 구현체) - 성능이 좋다. - Update 작업에 해당되는 Segment만 잠기고..
스프링 테스트 - 통합 테스트와 단위 테스트 참고 출처 : https://www.youtube.com/watch?v=SFVWo0Z5Ppo @SpringBootTest - 통합 테스트를 하기 위한 어노테이션 - 여러 기능을 조합해 전체 비지니스 로직이 제대로 동작하는지 테스트 - 테스트를 실행할 때마다 모든 빈은 스캔, 로드해 테스트 작업이 무거워질 수 있음 Unit Test - 단위 테스트 - 프로젝트에 필요한 모든 기능에 대한 테스트를 각각 진행 Unit Test의 F.I.R.S.T 원칙 - Fast : 테스트 코드는 빠르게 실행 - Independent : 각 Unit Test들은 독립적이여야 함 - Repeatable : 테스트는 매번 같은 결과 - Self-Validating : 각 테스트들은 결과 확인이 가능해야 함 - Timely : U..
스프링 테스트 - JUnit의 생명주기와 주요 어노테이션 참고출처 - https://www.youtube.com/watch?v=SFVWo0Z5Ppo JUnit - 생명 주기 - JUnit은 어노테이션으로 생명 주기별 테스트 작성을 지원 - @Test : 테스트용 메소드를 표현 (메인 코드 테스트) - @BeforeEach: @Test의 각 Unit 테스트들이 실행되기 전 실행 - @AfterEach: 각 Unit 테스트들이 실행된 후 실행 - @BeforeAll: JUnit의 테스트 생명주기 가장 처음 실행 - @AfterAll: JUnit의 테스트 생명주기 종료 후 실행 JUnit 메인 어노테이션 @SpringBootTest - 통합 테스트용 - @SpringBootApplication을 찾고, 하위의 모든 Bean을 로드 - Test용 Context를 만들..
스프링 테스트 - TDD, JUnit 참고 출처 : https://www.youtube.com/watch?v=SFVWo0Z5Ppo TDD - Test Driven Development - 테스트 주도 개발, 즉, 테스트를 먼저 만들고, 개발을 진행하는 것. - 애자일 개발 방식 중 하나 TDD를 적용하는 이유 - 코드의 안정성을 높임 - 기능을 추가, 변경에 대한 부작용을 방지 - 테스트 코드의 대상 코드 목적을 명확하게 표현 가능 ➡️ 불필요한 코드를 줄임 JUnit - Java의 대표적인 테스트 프레임워크 - Unit Test를 위한 도구를 제공 - 어노테이션 기반 - 스프링 부트 2.2 부터 JUnit 5 사용 - JUnit 5 = Jupiter + Platform + Vintage JUnit Jupiter - Test Engine A..