본문 바로가기
카테고리 없음

코딩공부(2025.07.14)-소켓통신, thread, 톰캣

by 쌀강아지33 2025. 7. 15.

소켓통신=네트워크 스트림

클래스가 현실세상의 뭐를 만든거지?

서버소켓은 서버기 본기능을 만들어 놓음(웹서버아니고 dbt서버도 아닌 가장 기본적인 기능을 만들어 놓은거)

서버는 항상 실행이 있어야 되고 클라이언트가 접속을 하면 어 클라이언트랑 서버랑 연결이 돼서 데이터를 주고 받는 거

무언가의 파일의 내용을 써서 보냄- 내용을 읽어서 보냄- 웹서버

vite로 하면 읽기 힘듦- buffer 형태로 함

소켓통신으로 채팅 프로그램이 아니라 tcp프로그램 만듦

<

실습>

OSI 7계층

(웹, DB, DNS, SSHD) 서버들이 응용프로그램 계층의 서버들

물리, 데이터링크, 네트워크, 전송, 세션, 표현, 응용- 반대방향으로 붙어서 동작

http-tcp-ip-이더넷 - 랜선을 통해서 나감

mariadb프로토콜이-tecp-이더넷붙어서 랜선을 통해서 나감

네트워크 스트림 만든 사람들이 물리, 데이터링크, 네트워크, 전송까지 만들어 놓았다고 생각

소켓통신-3-way handskake

스레드

보내고 받는 순서가 있는데 이대로하면 정해진 순서로 작동되어야함 - 여러번 보내고 여러번 받을수있게 하려면 스레드 즉 기본적으로 프로그램에서는 하나의 코드만 실행되는 게 정상이긴 한데 한 번에 동시에 여러 개의 코드를 실행할 수 있는것이 스레드

프로세스 : 실행중인 프로그램 / 프로세스는 기본적으로 1이상의 스레드로 코드를 실행

하나의 스레드가 하나의 코드만 처리를 할 수 있기 때문에 만약에 무한 반복문 같은 코드가 실행이 되면 그게 끝나기 전까지 다른 코드는 실행을 못하는 거

만약에 받으면서 보내는것도 동시에 하고 싶다 그러면 스레드를 하나더 만들어 줘야함

스레드 방식차이가 있다- 편한게쓰기 -직접 짜지는 않음

스레드 + 소켓통신

serveReadThread=clientReadThread

import static server.Server03.clientSocket;/ InputStream is = clientSocket.getInputStream();

 

serveWriteThread=clientWriteThread

import static server.Server03.clientSocket;/OutputStream os = clientSocket.getOutputStream();

이번 실습은 문법적해석 보다는 이 코드덩어리는 이런 부분- 이해의 영역이 아님 - 깊게 파는게 아님

1. 문법적 해석(객체, 매개변수, 생성자, 클래쓰) 2. 논리적인해석(이해가 아님)-덩어리 이부분은 이거다

톰캣(10버전)

서버프로그램을 만들고 싶긴한데 맨땅에서 만들기는 너무 힘들고 이미 만들어져 있는 서버에다가 우리가 필요한 기능만 추가해서 우리만의 서버를 만들고자

자바로 만들어져 있는 톰캣이라는 서버에 내가 만든 자바 프로그램을 추가해서 서버를 해봄

실행/디버그 구성 편집 tomcat 서버에 로컬- 구성- 위치(파일) 톰캣파일 지정-deployment 탭에서 +버튼 클릭하고 artifact 클릭해서 war 파일을 추가- 톰캣을 통해서 ex/web 주소로 접속하면 war 파일을 실행해

자바파일안에 com.example안에 HelloServlet/자바랑 같은 위치 webapp만들고 그안에 WEB-INF폴더안에 web.xml(톰캣으로 실행한 자바파일 목록을 적어둔거)파일 만듦-나중에 스프링은 알아서 해

bulid.gradle 파일 라이브러리 추가(maven repo 가서 추가)-수정하면 코끼리모양뜸- 새로고침

자바파일을 톰캣으로 실행되게 할거

실행하면 톰캣이 실행이됨- 톰캣 웹서버가 실행 - /web01- war파일 생행- 그안에 들어있는 /hello- java파일이 실행

build.gradle

xml파일-ml은 마크업랭귀지 파일-태그로 이루어짐 -html - 태그목록을 가져와서 쓰겠다

HelloServlet

웹프로젝트 생성

1. 프로젝트 구조 설정 -폴더를 만들고 -HelloServlet.java - 우리가 알던 자바 코드 파일web.xml - 톰캣으로 실행할 자바코드 파일 목록

2. build.gradle - id 'war' //war 파일 빌드를 위해 필요 dependencies { //서블릿 api compileOnly("jakarta.servlet:jakarta.servlet-api:6.0.0")

war{ webAppDirName = 'src/main/webapp' - 경로를 여기로 지정}

3. 톰캣서버 추가- 톰캣다운 후 압축 풀기 -edit configuration 에서 압축 푼 톰캣 추가 -Deployment 탭에서 + 버튼 클릭하고 artifact 클릭해서 war 파일을 추가- 톰캣을 실행하면 내프로젝트 코드들 (java.xml)을 war파일로 만들어서 클라이언트가 애플리케이션 컨텍스트에 설정된 주소로 접속하면 톰캣으로 실행하겠다

클라이언트가 애플리케이션- 변경-/web01 보기 좋게

HTTP 서블릿

http 요청을 톰켓한테 보내면 요청을 특정 url로 실행/어떤 url로 들어오면 이 부분이 이 클래스로 바뀌어서 실행

웹브라우저로 통해 서버에 요청을 보내면 코드 실행 - get / post방식으로 요청 했을때는 내가 따로 만들었음

http get 요청됐을 때는 메소드가 실행이 되게 해놨는데 내가 오버라이드 했으니까 내꺼 실행

톰캣이 한들이 깨짐- 톰캠과 인텔리젠스 설정이 다맞아야됨- 구성편집 -vm옵션 : -Dfile.encoding=UTF-8

웹 애플리케이션에서 클라이언트의 요청을 처리하고, 그에 대한 응답을 반환하는 자바 클래스

클라이언트의 HTTP 요청을 처리하기 위해 다양한 메서드를 제공

1.HTTP 요청: 클라이언트(웹 브라우저)가 HTTP 요청을 서버에 보냅

2.서블릿 매핑: 서블릿 컨테이너(Tomcat 등)는 요청을 특정 서블릿 클래스에 매핑, 매핑은 서블릿 설정 파일(web.xml)이나 애노테이션을 통해 이루어집

3. 서블릿 클래스: 서블릿 클래스는 HttpServlet 클래스를 확장(extend)하여 구현됩니다. 이 클래스에서 doGet, doPost, doPut 등의 메서드를 오버라이드하여 요청을 처리

웹 브라우저 클라이언트 프로그램으로 http 요청을 톰캣한테 보내면 톰캣이 포켓 통신 처리하고 http 이런 거 분석해 가지고 우리 서블릿 코드를 실행- 우리가 오버라이드 해서 우리걸로 바꿔어서 실행

톰캣 서버한테 컨텍스트를 보내서 특정 war 파일을 실행하게 해달라고 했고 그 war 파일 안에 들어있는 특정 주소로 특정 클래스를 실행해 달라고 요청을 보냈고 그러면 이제 메소드가 실행이 되게 되는데 걔한테 이렇게 데이터를 전달

get 방식으로 서버한테 데이터를 전달할때 url을 포함시켜 보냄 - 서버가 해당 데이터를 받을 때 쓰는 코드

쉽게-요청 들어오면 이거 실행되는구나

포켓통신을 구현이 된 톰캣을 쓰고 그안에 기능이 구현이 된 스프링을 쓸거임

 

<스프링 들어가기전기능을 직접 구현-팀프로젝트 활용>

백엔드주소를 - anioxinterceptor- 톰캣주소로 고침-baseURL: 'http://localhost:8080',

login.js-

let url = '/web01/hello';

await api.post(url, req)

톰캣doget 대신에 dopost로 고침

web.xml을 크로스오리진 전부 다허용 추가

로그인 해보면 정상적 요청이들어옴- 이걸 처리해야됨 - 어떻게 처리하느냐에 따라 로그인이 되구도 하고 회원가입이됨

POST 방식으로 JSON 형태의 데이터를 받을 때- 쉽게 처리하기 위해- 서버쪽으로 보내니깐 서버쪽에서 데이터를 받을 클래스를 만들어줌 (api 명세서랑 똑같이-프론트엔드)-각각 변수getter,setter 만들어줌

ObjectMapper objectMapper = new ObjectMapper();

User user = objectMapper.readValue(req.getReader(), User.class);

제이슨 형태의 데이터를 클래스 형태의 객체로 만들어서 반환

<추가학습>

run 대신 Debug로 실행- 라인 넘버 옆에 클릭 후 실행하면 거기서 멈춤 - 한번더 밑에 창에 실행- 다음 멈추는거 까지 실행- 변수에 뭐가 저장돼있는지 확인 + 제대로 실행 확인 가능

netstat -ano | findstr 12345 : 상태확인 - 123345 포트번호 listening

"파싱" (parsing)은 컴퓨터 과학이나 프로그래밍에서 데이터를 특정 규칙에 따라 분해하고 해석하는 과정을 의미

tar-리눅스/jar-자바압축/war-웹관 관련된 파일들압축

accpet()-동기방식의 블로킹 방식 - 톰캣

네티는 비동기의 논블로킹 방식

웹에서 한글 깨질때 - resp.setContentType("text/html;charset=utf-8");

tomcat 을 쓴다고 생각 - 코드를 실행할때 대신 tomcat안의 class는 안에 없으니 apache.catalina.filters.CorsFilter는 붉은색

요약

소켓 통신 : OSI 6계층에서 4계층까지의 통신을 만들어둔 것(TCP 3Way Handshake)

소켓의 입출력 스트림 : 클라이언트 프로그램과 서버 프로그램 사이의 통로

입출력 스트림으로 HTTP 프로토콜을 주고받으면 웹 서버와 웹 클라이언트가 됨

입출력 스트림으로 FTP 프로토콜을 주고받으면 FTP 서버와 FTP 클라이언트가 됨

입출력 스트림으로 SSH 프로토콜을 주고받으면 SSH 서버와 SSH 클라이언트가 됨

톰캣 서버 : 소켓 통신 + 쓰레드 + 파일 입출력 등을 구현해둔 서버

HTTP 요청 프로토콜

클라이언트 --------------------------------------->톰캣

Context 찾아서

web.xml 안에 클래스 찾아서 실행

웹 서버 : HTTP 동작 / 단순하게 파일 전송 / WAS / HTTP 동작 /코드를 실행해서 결과를 전송

톰캣을 사용한 이유 : 소켓 통신, HTTP 프로토콜 파싱, 파일 입출력을 톰캣이 미리 다 만들어놔서

웹 서비스의 서버가 해야하는 일은 파일 전송 기능 /로그인 /회원 가입 /데이터 CRUD /데이터 베이스에 INSERT /데이터 베이스에 SELECT /페이징

클라이언트의 입력 받아오기

스프링 : 로그인 기능, 클라이언트의 입력 받아오기, 페이징

로그인 : 클라이언트한테 데이터를 받는 것 ,DB에서 데이터 조회 , ID, PW 비교