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) { ..
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..
Java - 비동기 처리(ExecutorService / Future)
·
Java & Spring/Java
□ ExecutorService 정의여러 개의 스레드를 효율적으로 관리하고 재사용할 수 있도록 돕는 스레드 풀(Thread Pool) 관리 인터페이스submit() 또는 execute()를 통해 작업을 실행할 수 있다.작업을 실행하면 Future 객체를 반환하여 결과를 받을 수 있다. □ Future 정의ExecutorService.submit() 메서드를 호출하면 작업의 결과를 받을 수 있는 Future 객체가 반환된다.future.get()을 호출하면 결과를 가져올 수 있지만, 결과가 준비될 때까지 블로킹(대기) 된다.작업을 취소할 수도 있다 → future.cancel(true) □ 장점스레드 풀(Thread Pool)을 관리하면서 비동기 작업을 효율적으로 수행 □ 단점블로킹 방식이므로 결과를 기다..
Java - 비동기 처리(Thread & Runnable)
·
Java & Spring/Java
□ 단점새로운 스레드를 생성함으로 리소스 낭비가 발생스레드 생성 비용이 비쌈OS의 스레드 관리 부담이 커질 수 있음- Thread생성을 통한 비동기 처리 public static void main(String[] args) { final long startTime = System.currentTimeMillis(); for(int i = 0; i { try { log.info("{}번째 작업 {}, 소요시간: {}", finalI, plus(), System.currentTimeMillis() - startTime); } catch (Inter..