Thymeleaf - 변수(SpringEL)
·
Java & Spring/Thymeleaf
□ Controller@GetMapping("/variable") public String variable(Model model) { User userA = new User("userA", 10); User userB = new User("userB", 20); ArrayList list = new ArrayList(); list.add(userA); list.add(userB); HashMap map = new HashMap(); map.put("userA", userA); map.put("userB", userB); model.addAttribute("user", userA); ..
Thymeleaf - text, utext
·
Java & Spring/Thymeleaf
□ text- th:text="${data}"HTML 컨텐츠에 데이터를 출력th:text 사용 - [[${data}]]HTML 컨텐츠 안에서 직접 데이터 출력(태그 속성 X)컨텐츠 안에서 직접 출력하기 = [[${data}]] □ utext : 텍스트를 이스케이프 처리하지 않음- th:utext="${data}"th:utext = - [(${data})][(...)] = [(${data})] - 페이지 예시 @GetMapping("/text-unescaped") public String textUnescaped(Model model) { model.addAttribute("data", "Hello Spring!"); return "basic/text-unescape..
스프링 MVC - 기본기능
·
Java & Spring/Spring
□ HTTP 요청 파라미터※ 참고사항@ModelAttribute 생략 가능String, int 같은 단순 타입 = @RequestParamargument resolver 로 지정해둔 타입 외 = @ModelAttribute- @RequestParamHTTP 요청 파라미터(query string 또는 form data)를 메서드 파라미터에 바인딩할 때 사용.단일 파라미터나 간단한 자료형에 주로 사용됨.@GetMapping("/hello")public String hello(@RequestParam String name) { return "Hello " + name;} - @ModelAttribute폼 객체나 커맨드 객체처럼, 파라미터가 객체일 경우 사용.요청 파라미터들을 객체의 필드에 바인딩함 (자동..
스프링 MVC - 구조 분석
·
Java & Spring/Spring
□ 동작순서핸들러 매핑으로 핸들러 조회핸들러 어댑터 조회핸들러 어댑터 실행□ 핸들러 매핑0 = RequestMappingHandlerMapping : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용1 = BeanNameHandlerMapping : 스프링 빈의 이름으로 핸들러를 찾는다.□ 핸들러 어댑터0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용1 = HttpRequestHandler Adapter : HttpRequestHandler 처리2 = SimpelControllerHandlerAdapter : Controller 인터페이스 처리□ 뷰 리졸버1 = BeanNameViewResolver : 빈 이름..
스프링 MVC - 멀티 쓰레드
·
Java & Spring/Spring
□ 쓰레드애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행쓰레드가 없다면 자바 애플리케이션 실행이 불가능쓰레는 한번에 하나의 코드 라인만 수행동시 처리가 필요하면 쓰레드를 추가로 생성- 요청 마다 쓰레드 생성장점동시 요청을 처리리소스가 허용할 때 까지 처리가능하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작단점쓰레드 생성 비용은 매우 비쌈요청 마다 쓰레드를 생성하면 응답 속도가 늦어짐쓰레드는 컨텍스트 스위칭 비용이 발생쓰레드 생성에 재한이 없기 떄문에 요청이 너무 많이 오게 되면 임계점을 넘어 서버가 죽을 수 있음- 쓰레드 풀특징필요한 쓰레드를 쓰레드 풀에 보관하고 관리쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리, ..
스프링 MVC - 웹 애플리케이션의 이해
·
Java & Spring/Spring
□ 웹 서버(Web Server)HTTP 기반으로 동작정적 리소스 제공정적파일 HTML, CSS, JS, 이미지, 영상ex) NGINX, APACHE□ 웹 애플리케이션 서버(WAS - Web Application Server)HTTP 기반으로 동작웹 서버 기능 포함 + 정적 리소스 제공 가능프로그램 코드를 실행해서 애플리케이션 로직 수행동적 HTML, HTTP API(JSON)서블릿, JSP, 스프링 MVCex) Tomcat, Jetty, Undertow□ 서블릿(Servelet)서버 TCP/IP 연결 대기, 소켓 연결HTTP 요청 메세지를 파싱해서 읽기POST 방식, /save URL 인지Content-Type 확인HTTP 메세지 바디내용 파싱저장 프로세스 실행비즈니스 로직 실행HTTP 응답 메세지 생..
다익스트라(Dijkstra) - 최단경로 찾기
·
Java & Spring/알고리즘
□ 예제 : https://www.acmicpc.net/problem/1916□ 사용처 : 가중치가 있는 그래프에서 최단 경로를 찾는 알고리즘으로, 음수 가중치가 없는 경우에만 사용 □ 구현1. 변수선언 static int N; static int M; static List[] bus; static int[] cost; static boolean[] check;N : 종점 수M : 노선 수List[] bus : 버스 노선 인접리스트cost : 비용 배열2. Node 클래스 선언 static class Node { int destination; int cost; public Node(int e, int cost) { ..
Github Actions - Docker - EC2 무중단 배포하기
·
CI-CD
□ Dockerfile# 1. Gradle을 이용해 애플리케이션 빌드FROM gradle:8.12-jdk17 AS builderWORKDIR /appCOPY . .RUN gradle build --no-daemon# 2. 실행 환경FROM openjdk:17-slimWORKDIR /appENV DB_USERNAME=${DB_USERNAME}ENV DB_PASSWORD=${DB_PASSWORD}ENV jwt_secret_key=${jwt_secret_key}ENV origin_ip=${origin_ip}ENV aes_secret_key=${aes_secret_key}COPY --from=builder /app/build/libs/*.jar app.jarENTRYPOINT ["java", "-jar", "a..
Dockerfile Instuction
·
Docker
□ FROM컨테이너의 기반이 되는 이미지를 지정FROM openjdk:17-jdk-slim□ WORKDIR컨테이너 내부에서 작업할 디렉토리를 지정WORKDIR /app□ COPY로컬 파일을 컨테이너 내부로 복사할 때 사용COPY target/*.jar app.jar # Maven 빌드 결과 복사COPY build/libs/*.jar app.jar # Gradle 빌드 결과 복사□ ADDCOPY와 유사, ADD는 .tar.gz같은 압축파일을 자동으로 압축해제함ADD myfile.tar.gz /app/ # 압축 해제됨□ RUN컨테이너 이미지를 빌드할 때 명령어를 실행RUN mvn clean package -DskipTests # 테스트 제외하고 Maven 빌드 실행RUN ./gradlew clean b..
Java - 비동기처리(CompletableFuture)
·
Java & Spring/Java
□ CompletableFuture 정의비동기 작업을 처리하는 클래스로, 기존 Future의 단점을 해결하며, 논블로킹(Non-blocking) 방식으로 실행된다.□ 단점비즈니스 로직과 쓰레드관리 로직이 병합되어 관심사분리가 되지않고있다.□ 실습코드- 전역변수static final long startTime = System.currentTimeMillis(); - 간단한 연산 메서드private static double plus(double a, double b) { double plus = a + b; try { Thread.sleep(100); } catch (InterruptedException e) { Thread.cur..