Spring Boot 8

부트 외장톰캣 사용

부트로 만든 프로젝트는 jar로 말아져 톰캣을 포함한다..벗... 외장 톰캣을 사용해야하는 경우가 있다...생각보다 ... 외장톰캣을 사용하는 것은 간단하다.. 먼저 pom.xml에 .. 0.0.1-SNAPSHOT war // 추가 ext-tomcatwar로 말겠다고 명시를 해주고...  org.springframework.boot spring-boot-starter-tomcat provided 요놈도 요로코롬 provided로 바꿔줘야 한다고 지피티가 그랬는데 원래 이렇게 되어있었음...spring-boot-starter-tomcat을 provided로 설정하는 이유는 외장 톰캣을 사용할 때, 내장 톰캣 라이브러리를 제외하여 외장 톰캣의 서블릿 컨테이너에 의존하기 위함이다. 그렇지 않으..

Spring Boot 2024.12.12

Spring MVC가 아닌 Boot RestAPI에서 DispatcherServlet 동작 흐름

https://99duuk.tistory.com/118 Spring MVC 설정 파일 이해하기 : web.xml & dispatcher-servlet.xmlweb.xml는 서블릿 컨테이너에 대한 전반적인 설정을 담당한다.1. DispatcherServlet 정의2. URL 패턴과 DispatcherServlet 매핑3. Spring 설정 파일 위치 지정4. ContextLoaderListener 등록 (필요한 경우) dispatcher org.sprin99duuk.tistory.com읽다가 문득 View를 사용하지 않는 구조에서는 어떻게 되나 싶어서 비교해봄   | Spring MVC 프로세스1. DispatcherServlet- 모든 요청이 DispatcherServlet으로 들어옴- Front Con..

Spring Boot 2024.10.22

JSON_ARRAYAGG & @JsonRawValue

데이터베이스에서 테이블 조회할 때, 대부분 컬럼(AAA, BBB, CCC, DDD, EEE)은 값이 같은데, 딱 하나(JJJ)만 여러 값을 가지는 상황이 생겼음AAA~EEE 값이 같아도 JJJ 값이 다르면 별도의 행으로 나옴    우선, SQL에서 JSON_ARRAYAGG 함수를 써서 여러 값 가진 컬럼을 JSON 배열로 바꿨음.SELECT AAA, BBB, CCC, DDD, EEE, JSON_ARRAYAGG(DISTINCT JJJ) AS JJJFROM TABLE...GROUP BY AAA, BBB, CCC, DDD, EEE이렇게 하니까 쿼리 결과는 원했던 대로  [10, 20, 30] 이런 식으로 잘 나왔음      다음으로, 이 데이터 담을 DTO를 만들었음. RestController 사용해서 응..

Spring Boot 2024.09.24

AOP를 활용한 브라우저 캐시_4 정적 리소스 캐싱 명시

막상 개발 서버에 올리니까 첫번쨰 요청은 30초가 걸리고, 캐싱된 두번째 요청도 20초가 걸렸다. 로컬은 2초 걸렸는데...네트워크 들어가보니 정적 리소스가 하나도 캐싱되지 않았다. 같은 jar인데 ...  @Configurationpublic class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/css/**", "/js/**", "/images/**", "/fonts/**") .addResourceLocations("classpath:..

Spring Boot 2024.09.11

AOP를 활용한 브라우저 캐시_1_전략 전택

Spring Boot와 Vue로 구성된 프로젝트에서 서버 요청이 많아 브라우저 속도가 느려지는 문제가 생겼다. 반복되는 요청을 최소화하고 성능 개선을 위해 캐시를 선택했고, 먼저 클라이언트에 캐싱할지 서버에 캐싱할지 선택했다. [ 캐싱의 장점 ]더보기응답 시간 단축:자주 요청되는 데이터를 빠르게 제공사용자 경험 향상서버 부하 감소:반복적인 연산과 데이터베이스 쿼리 감소서버 리소스 절약네트워크 트래픽 감소:불필요한 데이터 전송 최소화대역폭 사용 효율화확장성 개선:동일한 하드웨어로 더 많은 요청 처리 가능비용 효율적인 성능 향상가용성 향상:서버 장애 시에도 캐시된 데이터로 부분적 서비스 제공 가능일관된 성능:트래픽 급증 시에도 안정적인 응답 시간 유지캐싱을 효과적으로 구현하기 위한 몇 가지 팁:캐시 계층 다..

Spring Boot 2024.09.10

AOP를 활용한 브라우저 캐시_2_ETag & 인터셉터 (실패)

초기접근일단 지난 주에 공부했던 AOP로 어노테이션을 만들어서 간단하게 Cache-Control: public, max-age=300 → 서버가 브라우저에 300초(5분) 동안 응답을 캐시하라고 지시. 를 설정해보았다.@GetMapping("/api/data")@CacheControl(maxAge = 3600)public ResponseEntity getData() { // ...}200 대신 304 응답이 오는 걸 확인했고, 일단 캐시가 되긴 했다  수백 개의 컨트롤러에 일일이 어노테이션을 추가해야 하는 번거로움캐시 정책의 일관성 유지가 어려움유지보수의 어려움 모든 컨트롤러에 캐싱 처리하려고 했기 때문에 어노테이션을 모든 컨트롤러마다 달아주기 귀찮아서방법을 떠올리다 인터셉터로 처리해버리는 방안을 ..

Spring Boot 2024.09.10

Controller Annotation

1. @RequestParam역할: URL 쿼리 파라미터에서 값을 추출합니다.주로 사용되는 경우: GET 요청에서 URL 뒤에 붙은 쿼리 스트링(?key=value)에서 값을 받아올 때.@GetMapping("/search")public String search(@RequestParam("keyword") String keyword) { return "Search result for: " + keyword;} GET /search?keyword=spring 요청 시, keyword 값은 "spring"으로 바인딩.2. @PathVariable역할: URL 경로에 포함된 변수를 메소드 파라미터로 매핑주로 사용되는 경우: RESTful API에서 리소스 식별자(ID 등)를 경로에 포함시켜 동적으로 값을..

Spring Boot 2024.09.04