⬛ 애노테이션의 필요성🟢 애노테이션 필요성기존의 리플렉션 서블릿으로는 메서드와 URL 매핑의 유연성이 부족.메서드와 URL을 별도로 매핑하거나, 주석과 같은 정보를 활용해 프로그램이 동적으로 동작할 수 있는 방법이 필요.애노테이션은 컴파일러나 런타임에서 처리 가능한 메타데이터를 제공하여 이런 문제를 해결.@Retention(RetentionPolicy.RUNTIME)public @interface SimpleMapping { String value();}public class TestController { @SimpleMapping("/home") public void home() { System.out.println("홈 실행"); }}여기서 핵심은 애노테이션은 메타데이터를 활용해 동..
Java
이번 강의에서는 간단한 클라이언트-서버 네트워크 프로그램을 만들어보자.⬛ 리플렉션 개념🟢 리플렉션Java 프로그램이 실행 중에 자기 자신을 들여다보고, 구조를 분석하거나 조작할 수 있는 기능을 의미한다.이를 통해 클래스, 메서드, 필드 등의 메타데이터를 동적으로 탐색하거나 실행할 수 있다. 🟢 리플렉션 제공 기능클래스 정보 조회:클래스 이름, 부모 클래스, 구현된 인터페이스, 패키지 정보를 얻을 수 있음.메서드, 필드, 생성자 등의 정보를 조회할 수 있음.메서드 호출:특정 메서드의 이름을 통해 런타임에 메서드를 동적으로 실행할 수 있음.필드 값 변경:객체의 필드 값을 직접 변경하거나 읽을 수 있음.객체 생성:특정 클래스의 생성자를 이용해 객체를 동적으로 생성할 수 있음.⬛ 클래스 메타데이터 조회pub..
이번 강의에서는 간단한 클라이언트-서버 네트워크 프로그램을 만들어보자.⬛ 객체화된 요청과 응답 처리 HttpRequest:요청 메서드(GET, POST), 경로(Path), 쿼리 파라미터(Query Parameters) 등을 구조화.HttpResponse:응답 상태 코드(200, 404 등), 헤더(Content-Type 등), 바디 작성 지원.🔷 HttpRequest/** * HTTP 요청을 파싱하는 클래스 */public class HttpRequest { private String method; // HTTP 메서드 (GET, POST 등) private String path; // 요청 경로 private final Map queryParameters = new HashMap(); // 쿼리..
이번 강의에서는 간단한 클라이언트-서버 네트워크 프로그램을 만들어보자.⬛ 클라이언트와 서버 간 대화컴퓨터가 "메시지"를 보내면 "메시지 + 반가워!" 라고 응답을 주는 프로그램을 만들어보자.🔷 클라이언트 코드public class ClientV1 { private static final int PORT = 12345; public static void main(String[] args) throws IOException { log("클라이언트 시작"); Socket socket = new Socket("localhost", PORT); DataInputStream input = new DataInputStream(socket.getInputStream()); DataOutputStream out..
본 편은 해당 강의 내용과 더불어, "면접을 위한 CS 전공지식 노트" 에서 연관내용을 함께 정리요약한 내용임을 밝힌다. :)⬛ 인터넷 프로토콜 스택 4계층⬛ IPIP(인터넷 프로토콜)는 네트워크 상에서 장치 간 데이터 송수신을 위해 사용되는 주요 프로토콜로, 장치 간 고유 주소를 제공하여 데이터가 정확한 목적지에 도달하도록 한다. 🟢 IP 인터넷 프로토콜 역할지정한 IP 주소에 데이터 전달패킷이라는 통신 단위로 데이터 전달🟢 IP 인터넷 프로토콜 한계비연결성: 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷전송비신뢰성: 중간에 패킷이사라지거나, 순서대로 오지 않는 문제프로그램 구분: 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘이상일때 문제🟢 IPv4 vs IPv6 Pv4는 32비..
⬛ File, Pathfile은 옛날에 쓰던 방식이다. (레거시코드볼때..just참고)public class OldFileMain { public static void main(String[] args) throws IOException { File file = new File("temp/example.txt"); File directory = new File("temp/exampleDir"); // 1. exists(): 파일이나 디렉토리의 존재 여부를 확인 System.out.println("File exists: " + file.exists()); // 2. createNewFile(): 새 파일을 생성 boolean created = file.createNewFile(); System..
⬛ 파일에 데이터 저장하기데이터를 파일에 저장하기 위해서는 FileOutputStream을, 파일에서 데이터를 읽기 위해서는 FileInputStream을 사용한다.write()와 read() 메서드를 통해 데이터를 바이트 단위로 쓰고 읽을 수 있으며, 파일의 끝에 도달하면 -1을 반환한다.public class StreamStartMain2 { public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("temp/hello.dat"); fos.write(65); fos.write(66); fos.write(67); fos.close(); FileInputStream ..
⬛ Graceful Shutdown어느 날, 개발자는 서버(피자 가게)를 업데이트하려고 한다. 그런데 문제는 주문 처리 중에 서버가 멈추면 고객이 화를 낼 거다! 😱그래서 개발자는 생각한다.개발자: "새로운 주문을 막고, 이미 받은 주문은 모두 끝낸 후에 서버를 꺼야 해!"→ 여기서 등장한 것이 우아한 종료(Graceful Shutdown)! 🟢 ExecutorService 종료 메서드shutdown():새로운 작업은 받지 않지만, 진행 중인 작업은 모두 완료 후에 종료.논 블로킹 방식 (호출 후 바로 다음 코드 실행 가능).shutdownNow():모든 작업을 중단하고 즉시 종료.진행 중인 작업도 중단(인터럽트 발생).블로킹 방식 (호출 후 작업이 중단될 때까지 기다림).🟢 종료 상태 확인 메서드..
⬛ 스레드를 직접 사용할 때의 문제점개발자A는 하나하나 스레드를 만들어서 일을 처리하고 있다. 스레드를 만들고, 요청을 처리하고, 또 다른 스레드를 만들고...하지만 문제가 발생한다. 스레드를 만들 때마다 CPU가 점점 느려지고, 메모리 사용량이 크게 늘어나기 때문이다. 스레드 하나당 많은 메모리를 차지하고, 관리도 어렵다. 또한 A가 만들 수 있는 스레드 수는 한정되어있다. 따라서 최대 스레드 수까지만 스레드를 생성할 수 있게 하고싶다.⬛ 스레드 풀🟢 스레드 풀컬렉션에 스레드를 보관하고 재사용처리 작업이 없으면 대기(WAITING),작업 요청이 오면 RUNNABLE하지만 스레드 풀의 관리가 복잡해지고, 작업의 효율을 더 높여야 할 필요가 생겼다.⬛ Executor 프레임워크 소개Executor 프레임..
⬛ Lock ConditionReentrantLock과 Condition을 사용하여 생산자와 소비자가 서로 독립적인 대기 집합을 사용하도록 분리한다. 이는 효율적인 대기를 가능하게 하여 불필요한 스레드 깨어남을 방지한다. ReentrantLock 은 내부에 락과, 락 획득을 대기하는 스레드를 관리하는 대기 큐가 있다.condition.await(): Object.wait()와 유사하며, 현재 스레드를 대기 상태로 보관하면서 ReentrantLock에서 획득한 락을 반납한다.condition.signal(): Object.notify()와 유사하며, 대기 중인 스레드 하나를 깨워 대기 상태에서 빠져나오게 한다. 기존 코드를 ReentrantLock과 Condition을 사용하도록 바꾸면 아래와 같다. 🔶..