공부의 기록/자바 풀 스택 : 수업내용정리

자바 풀 스택 1/3 오전 기록 030-1

파티피플지선 2025. 1. 3. 12:35

9:27 도착

 

 

<9:30 1교시>

어제 오전에 했던 upstream 원격 저장소 등록하기 다시 시도함.

나는 처음에는 잘하다가 upstream을 내걸로 등록해버려서 다시 upstream2에다가 선생님 원격저장소 링크를 연결 시킴

 

git   remote   remove   upstream

명령어로 upstream을 삭제할 수 있음

PS C:\Users\acorn\Desktop\playground\visual_work\lecture2> git remote remove upstream
PS C:\Users\acorn\Desktop\playground\visual_work\lecture2> git remote -v
origin  https://github.com/CrystalJiSeon/lecture2.git (fetch)
origin  https://github.com/CrystalJiSeon/lecture2.git (push)
upstream2       https://github.com/oli999/lecture.git (fetch)
upstream2       https://github.com/oli999/lecture.git (push)
PS C:\Users\acorn\Desktop\playground\visual_work\lecture2>

 

git   remote   rename   바꾸고싶은이름   바꿀이름

명령어로 upstream 이름을 변경할 수 있음

 

작업을 진행할 가지의 이름은

feature/기능이름

으로 작성한다.

 

git   branch   feature/기능이름

git   checkout   feature/기능이름

 

새로만든 가지에서 작업을 진행하고 스테이지에 올려 커밋한다.

 

git   add   .

git   commit   -m   "커밋메세지"

 

커밋한 내용을 origin(내 깃허브의 origin)에 push한 후, git hub 페이지에서 pull request 요청한다

 

git    push    origin    feature/기능이름

 

 

<10:30 2교시>

선생님(조장)이 merge한 후 깃허브에서 pull request 한 브랜치 삭제

git bash에서 삭제하는 방법은 참고로 알아두면   >   git    push    origin    --delete 삭제할브랜치이름

 

로컬에서도 merge 된 브랜치 삭제하기

git   branch   -D   삭제할브랜치명

 

 

 

우리는 웹프로그래밍을 공부하는 동안은 하나의 서버당 여러개의 프로젝트를 서비스할 것이다.

원래는 하나의 서버당 하나의 프로젝트가 필요하다.

 

/프로젝트이름   은  context path라고 하고 이것은 서비스할 프로젝트를 구분해주는 이름이자, webapp폴더로서 최상위 경로의 역할을 한다.

그 하위 경로가 제대로 작성되기만 하면 톰캣서버가 알아서 요청에 대해 읽어들인 내용을 그대로 응답해준다.

만약에 요청에 대해 응답할 수가 없다면 404 요청 오류 페이지가 나타난다.

 

요청에 대한 응답은 html 형식의 문자열이나 이미지 파일, 기타 파일 등으로 전달되는데 이걸 웹페이지가 읽어서 html 페이지를 띄워주거나 이미지, 기타 데이터 자체를 보여준다.

 

링크는 무조건 get 방식 요청 → 어디로 이동할 것인지 경로를 제대로 잘 써줘야 한다.

링크를 누르면 주소창이 바뀐다. 링크의 작성법 3가지(상대경로 작성법 1개와 절대 경로 작성법 2개)

 

클라이언트의 요청에 대해 응답하는 객체를 servlet 객체라고 한다.

클래스로 생성된 객체가 응답한 내용

 

어제 했던 작업 중 ping 을 누르면 pong을 전달하는 페이지는 webapp에 존재하지도 않는 pong.html을 읽어들인 것이 아니고, HttpServlet 클래스를 이용해 만든 객체가 응답한 내용이다.

 

 

 

1. 클래스를 만든다. (public class PingServlet)

2. HttpServlet 클래스를 상속 받는다 (extends HttpServlet)

3. Override 한다(service를 컨트롤 스페이스 눌러서 override)

4. 요청을 받을 경로를 작성하는데, 굳이 프로젝트 이름을 쓰진 않는다.  (  @WebServlet("/ping")   )

 

클라이언트가 최초로 "/ping"요청을 해오면 tomcat 서버가 new PingServlet()을 해서 객체를 생성한 후 해당 객체의 service() 메소드를 알아서 호출해준다.

이후 다른 클라이언트가 "/ping"요청을 다시해도 PingServlet 객체를 새로 생성하지 않고 기존에 생성된 객체를 다시 사용한다. 서버가 스레드를 만들어서 알아서 다수의 클라이언트를 상대하는데 만들어진 하나의 객체를 계속 재활용하는 거.

스레드는 응답후 폐기되니까 서블릿 객체는 하나만 있어도 여러명 상대 가능.

근데 이게 한 서버 내에서 한 번 생성되면 여러번 쓸 수 있는거지 다른 서버 만들면 또 거기서 한번은 객체를 생성해줘야 함

 

 

톰캣 서버가 알아서 HttpServletRequest 객체와 HttpServletResponse 객체를 만들고 전달해줌. 

request : 요청에 대한 정보를 가지고 있는 HttpServletRequest 객체의 참조값을 전달

response: 응답에 관련된 정보를 가지고 있는 HttpServletResponse 객체의 참조값을 전달

이게 어떻게 만들어졌는지는 몰라도 전달된 객체를 가지고 어떤 동작을 할지 우리가 부분적으로 프로그래밍하여 쓰면 된다.

(고하는데 나는 어떻게 만들어졌는지도 궁금한데 ㅠㅠㅠ 도와줘 지피티 선생님)

 

 

 

<11:30 3교시>

 

 

 

 

서블릿에서 웹 브라우저에 문자열을 출력할 수 있게 해주는 기본 틀

→ template(preferance>java>editor>template)으로 등록하고 쓰면 편함

		//응답 인코딩 설정
		response.setCharacterEncoding("utf-8");
		//응답 컨텐트 설정
		response.setContentType("text/html; charset=utf-8");
		//html 형식의 utf-8을 응답해줄게, 라고 알려주는 정석적인 형식
		
		
		//요청한 클라이언트에게 문자열을 출력할 수 있는 객체
		PrintWriter pw=response.getWriter();
		pw.println("<!doctype html>");
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<meta charset='utf-8'>");
		pw.println("<title></title>");
		pw.println("</head>");
		pw.println("<body>");
		
		pw.println("</body>");
		pw.println("</html>");
		pw.close();

 

 

 

 

 

 

오늘 오전 수업 때 했던거 코드 정리

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.html</title>
</head>
<body>
	<div class="container">
		<h1>인덱스 페이지</h1>
		<ul>
			<li><a href="fortune">오늘의 운세</a></li>
		</ul>
	</div>
</body>
</html>
package test.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.http.HttpRequest;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;



//요청 경로 작성 시 주의 점
//1. context path는 생략한다.
//2. 반드시 /로 시작한다.

@WebServlet("/fortune")
public class FortuneServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//어떤 로직에 의해 오늘의 운세를 얻어 왔다고 하자
		String fortuneToday="동쪽으로 가면 귀인을 만나요";
		
		
		//응답 인코딩 설정
		response.setCharacterEncoding("utf-8");
		//응답 컨텐트 설정
		response.setContentType("text/html; charset=utf-8");
		//html 형식의 utf-8을 응답해줄게, 라고 알려주는 정석적인 형식
		
		
		//요청한 클라이언트에게 문자열을 출력할 수 있는 객체
		PrintWriter pw=response.getWriter();
		pw.println("<!doctype html>");
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<meta charset='utf-8'>");
		pw.println("<title></title>");
		pw.println("</head>");
		pw.println("<body>");
		pw.println("<p>오늘의 운세:  <strong> "+fortuneToday+"</strong></p>");
		pw.println("</body>");
		pw.println("</html>");
		pw.close();
		
	}
}

 

<12:30 4교시>

새로운 블로그 글로 교재 정리 시작