스프링 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..
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..
6. 비동기 처리(AtomicBoolean, Future<?>)
·
프로젝트/coin-trading
private final ConcurrentHashMap> userTrades; private final ExecutorService executorService; private final Map userRunningStatus; private final BackDataRepository backDataRepository; private final UpbitService upbitService;- 프로그램 실행 public void startTrading(AuthUser authUser) { String userId = authUser.getUserId(); // 이미 실행 중인 거래 프로그램이 있는지 확인 if (userTrades.con..