2025.03.11
스레드, 네트워크, Servlet
스레드
프로세스(Process)
실행중인 프로그램
- 프로그램이 실행 될 때 마다 개별적으로 생성
- 하나의 프로세스 = 할당 받은 자원(프로그램 수행 함에 있어 필요한 데이터, 메모리 등) + 하나 이상의 Thread
스레드(Thread)
프로세스 내에서 할당 된 자원을 이용해 실제 작업을 수행하는 작업의 단위
- 모든 프로세스는 하나 이상의 스레드를 가지며 각각 독립적인 작업 단위를 가진다.
메인 스레드와 프로세스 종료
- 모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하며 시작
- main 메소드의 첫 번째 코드부터 아래로 순차적 실행, return 구문을 만나게 되면 종료
- 필요에 의해 작업 스레드를 만들어 코드를 병렬로 실행할 수 있다.
멀티 Process & 멀티 Thread
- 멀티 프로세스(Process) : 각각의 프로세스를 독립적으로 실행
- 멀티 스레드(Thread) : 하나의 프로세스 내에서 여러 스레드가 동시에 작업 수행

싱글 Thread 와 멀티 Thread
- 싱글 Thread : 메인 스레드 하나만 가지고 작업을 처리 -> 순차적 진행
- 멀티 Thread : 메인 스레드 외에 추가적인 스레드를 이용하여 병렬적으로 작업 처리
- 멀티 Thread 장점!
- 자원을 보다 효율적으로 사용 가능
- 사용자에 대한 응답성 향상
- 분리된 작업으로 코드가 간결
- 멀티 Thread 단점!
- 동기화 주의 필요
- 교착 상태 발생 주의
- 프로그래밍 시 고려 해야 할 사항 다수

- run() : run() 코드 실행, 단일 스레드 메서드
run() 메소드는 main() 메소드 위에 쌓이게 된다.
- start() : run() 코드 실행, 멀티 스레드 메서드
start() 메소드가 새로운 Thread 를 생성하고 그 위에 run() 가 쌓이게 된다.


스레드 생성방법
객체 생성 후 Thread 타입의 인스턴스로 변환 후 Thread / Runnable 사용
- Thread 클래스 상속 받는 방법
- Runnable 인터페이스 상속 받는 방법
Thread Controll
스레드를 어떤 순서로 동작 시킬 지 결정하는 것
우선 순위 방식 (Priority)
- 우선 순위가 높은 스레드가 작업 시간을 더 많이 가지게 하도록 하는 스케줄링 방식
- 스레드에 1 ~ 10 까지 우선 순위 번호 부여 가능하다. (default = 5)
순환 할당 방식 (Round-Robin)
- 시간 할당량(Time Slice) 를 지정하여 하나의 스레드를 정해진 시간만큼 실행
- JVM 에 의해 정해지며 Code Controll 불가
네트워크
네트워크
여러 대의 컴퓨터를 통신 회선으로 연결한 것
Server
서비스를 제공하는 컴퓨터(프로그램)
- 클라이언트의 연결을 수락하고 Request 내용을 처리 후 Response
Client
서비스를 제공 받는 컴퓨터(프로그램)
- 서버의 DATA를 필요로 하는 모든 Application
Socket Programming
Socket Programming
소켓을 이용한 통신 프로그래밍
- Socket : 프로세스 간의 통신에 사용되는 양쪽 끝 단
TCP
- 데이터 전송 속도가 느림
- 정확하고 안정적으로 Data를 전달할 수 있다.
- 연결 지향적 프로토콜
- TCP Socket Programming
- 클라이언트와 서버 간의 1:1 소켓 통신
- 서버가 먼저 실행되어 클라이언트의 요청을 기다린다.

UDP
- 데이터 전송 속도가 빠름
- 신뢰성 없는 Data를 전송할 수 있다.
- 비연결 지향적 프로토콜
- UDP Socket Programming
- 연결 지향적이지 않다.
- 요청을 받아 줄 의무가 없고 전달하는 것에 목적

Servlet
Server-Client-Model
- 서버는 특정한 서비스를 제공하는 컴퓨터를 의미
- 클라이언트는 이러한 서비스를 이용하는 사용자를 의미
Server 종류
Web Server
웹 브라우저와 Http 프로토콜을 사용하여 사용자의 요구에 따른 특정한 서비스를 제공하는 서버
DataBase Server
발생하는 Data를 저장, 열람, 추가, 수정, 삭제
Web의 통신 구조

Web-Server
사용자에게 HTML 페이지나 이미지를 HTTP 프로토콜을 사용하여 웹 브라우저에 제공하는 서버
- 내부의 내용이 이미 만들어져 있는 정적인 요소들을 화면에 보여주는 역할(HTML,이미지,CSS,JavsScript 등)
- Web Server 의 종류 : Apache, Microsoftlls, Nginx
- ex) 네이버 첫 화면
Was-Server
Web Application Server
- 사용자가 요청한 서비스의 결과를 스크립트 언어로 가공
- 가공하여 생성한 동적인 페이지를 사용자에게 보여주는 역할
- Was Server 의 종류 : tomcat, WildFly, Jeus
- ex) 네이버 로그인, 검색 결과 페이지, 회원가입 ...
Web
장점
- 요청에 대한 결과 페이지만 전송하기 때문에 빠른 처리 속도
- HTML 같은 단순한 문서로 작성하기 때문에 구현이 간단
단점
- 이미 구현된 정보만 보여주기 때문에 한정적인 서비스
- 문서의 내용이 변경되면 직접 수정해야 함 -> 변경 내용 반영 시 어려움
Was
- client(사용자)
- 사용자가 웹사이트에 접속하여 web 서버에 요청을 보냄
- Web Server(웹 서버)
- client 요청을 받아 정적 콘텐츠 제공
- 동적인 요청 -> Was로 전달
- Was Server(웹 애플리케이션 서버)
- web 서버로 받은 요청을 Servlet Container(서블릿 컨테이너) or JSP Container(JSP 컨테이너)에서 처리. Was Server -> Container(Servlet Container + JSP Container)
- 데이터베이스와 연동하여 필요한 데이터를 가져오거나 비즈니스 로직을 실행
- 프로그램 실행
- WAS 멀티 스레딩 방식으로 여러 사용자의 요청을 동시에 처리
- 사용자 요청이 많아도 동시에 여러 개의 프로세스를 실행하여 빠르게 응답
장점
- 여러 데이터를 활용할 수 있기 때문에 서비스의 다양성이 증대
- 문서의 내용이 변경 될 경우 직접 수정하지 않는다 -> 추가, 수정, 삭제 등이 편함
단점
- 데이터를 처리하여 결과를 응답하기 때문에 처리 속도가 느릴 수 있다.
- 변경 서비스에 대한 소스 코드를 직접 작성해야 하기 때문에 구현 난이도가 높다.
Container
Servlet Container
- 서블릿의 생명 주기를 관리 -> 초기화, 생성, 소멸
- HttpServletRequest(사용자한테 요청을 받았을 때), HttpServletResponse(사용자한테 응답을 해줄 때) 객체를 생성
- 요청에 따라 멀티스레딩 구성, 전송 방식에 따라 동적으로 페이지 구성 작업 진행. 정적로딩 처리!!
JSP Container
- JSP 파일을 Java 코드로 변경 해주고, Class 파일로 전환하여 메모리 공간에 로드
- 로드 후에 실행 가능하게 만드는 작업을 진행한다 -> Serlvet 화
- 처리 결과를 HTML 파일로 만들어주는 작업 진행. 동적로딩 처리!!
서블릿 라이프사이클
- 서버가 start 될 때 인스턴스를 생성하고 init()를 호출
- public void init(ServletConfig config) throws ServletException : 서블릿 최초 요청 시에만 동작하는 메소드
- public void destroy() : 컨테이너가 종료될 때 호출되는 메소드이며 주로 자원을 반납하는 용도로 사용
- public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException : 서블릿 컨테이너에 의해 호출되며 최초 요청 시에는 init() 이후에 동작하고, 두 번째 요청부터는 init() 호출 없이 바로 service()를 호출
서블릿 라이프 사이클 확인 방법
-
.xml 이용

- servlet-class 부분에 디렉토리 주소를 넣어서 연결 및 요청
- servlet-name : 서블릿의 논리적인 이름을 지정
- load-on-startup : 서버 시작 시 서블릿을 즉시 로드하도록 설정

- servlet-mapping : 특정 URL을 위에서 정의한 서블릿과 연결, /xml-lifecycle로 들어오는 요청이 LifeCycleTestServlet에서 처리됨을 의미
- servlet-class : 서블릿 클래스의 전체 패키지 경로를 지정하는 요소, 실제 요청을 처리하는 서블릿 클래스를 지정
- url-pattern : 클라이언트가 요청하는 URL과 서블릿을 연결하는 역할, 어떤 URL이 해당 서블릿과 매핑될지를 결정
-
Annotation 이용
Annotation(애노테이션)
자바 코드에 추가적인 메타데이터(설명)를 제공하는 기능
- 컴파일러에게 정보 제공
- @Override
- 런타임(실행 중)
- @WebServlet
- 코드를 자동으로 생성하거나 설정을 단순화
- @Getter, @Setter
컴파일러 관련 애노테이션
@Override : 메서드가 부모 클래스의 메서드를 오버라이딩하고 있음을 명시.
@Deprecated : 해당 코드가 더 이상 사용되지 않음을 알림.
@SuppressWarnings : 컴파일러 경고를 무시
런타임(실행 중) 사용하는 애노테이션
@WebServlet : 서블릿을 정의하는 데 사용, .xml 파일을 사용하지 않고 설정가능
- @WebServlet(value = "/서블릿이 처리할 URL 패턴 지정", loadOnStartup =1)
- loadOnStartup : 서블릿의 로드 순서를 지정하는 옵션(숫자가 낮을 수록 우선순위가 높음)
@Entity : JPA 엔티티 클래스로 설정
@SpringBootApplication : 스프링 부트 애플리케이션의 시작점
자동 코드 생성을 활용한 애노테이션
@Getter : 자동으로 Getter 메서드 생성
@Setter : 자동으로 Setter 메서드 생성
@ToString : toString() 메서드 자동 생성
참고