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

자바 풀 스택 1/2 오후 기록 029-2

파티피플지선 2025. 1. 2. 18:10

<14:30 5교시>
 
javac.exe 로 컴파일하고 java.exe로 실행했음.
윈도우 명령 프롬프트가 이걸 실행할 수 있는 이유는 환경 변수 창에서 변수를 연결하고 편집해서 가능해진 것.
 
환경 변수 창에서 사용자에 대한 변수와 시스템에 대한 변수가 있는데, 명령프롬프트가 이걸 읽어서 찾아서 응용프로그램을 바로 실행해줌.
 
프로젝트 우클릭 export > java의 Runnable JAR file > next >Launch Configuration (Configuration 종류가 너무 많으면 Run Configuration 에서 다 지우고, 만들려는 빌드 파일만 다시 run 해서 뜨게 만들어놓고 진행) >저장을 진행할 경로와 파일 이름 저장 
 
 
만들고 나서 명령 프롬프트에서
java -jar BookstoRead.jar로 실행 가능

 
exe 파일 만들기(참고로만 보면 됨)
JSmooth 프로그램을 활용해서 만든다고 함(믿을 수 있는건지는 글쎄 모르겠는데 )
JSmooth download | SourceForge.net

JSmooth

Download JSmooth for free. JSmooth creates standard Windows executable files (.exe) that smartly launch java applications. It makes java deployment much smoother and user-friendly, as it is able to find and run Java VMs by itself, or help the user get one

sourceforge.net

아래거는 맥 환경에서 하는 방법인듯

더보기

--- M1 환경에서 네이티브 바이너리 생성


GraalVM 설치:

GraalVM을 다운로드하고 설치합니다.
Homebrew를 사용한 설치:
bash
코드 복사
brew install --cask graalvm/tap/graalvm-ce-java17
Native Image 빌드 도구 설치:

bash
코드 복사
gu install native-image
네이티브 실행 파일 생성:

bash
코드 복사
native-image -jar MyApplication.jar MyApplication
생성된 실행 파일 실행:

bash
코드 복사
./MyApplication

 
JSmooth 실행하기




앱 여는 화면 영상 찍었는데 도저히 안 올라가는거 같다. 일단 다른 기회에 재시도 해보자.
 
 
 
<15:30 6교시>

java 에서 switch workspace해서 web_work로 바꿔서 launch해서 웹 프로그래밍 시작

 
Apache Tomcat® - Welcome!

Apache Tomcat® - Welcome!

The Apache Tomcat® software is an open source implementation of the Jakarta Servlet, Jakarta Pages, Jakarta Expression Language, Jakarta WebSocket, Jakarta Annotations and Jakarta Authentication specifications. These specifications are part of the Jakarta

tomcat.apache.org

다운로드 하고 압축해제해서 web_work 폴더 만든 곳에 놓기

 
 

 
 
이클립스는 원래 웹 개발을 위한 환경을 준비하고 있다.
서버를 등록하고 웹 개발을 시작할 수 있다.
 
 

 
 

 
 
디폴트로 사용하는 포트가 오라클과 겹친 상태이기 때문에 포트번호를 8888로 바꾼다.
 
 

 
server.xml > 소스코드 > 64행 port를 8888로 바꾸기
 
서버를 시작하고 종료하는 방법


 

 
 

 
add 한 다음 서버를 시작하고 주소창에 localhost:8888/Hello/index.html을 입력하면 방금 작업한 html 페이지가 보임.
Hello는 프로젝트 이름인데 이게 webapp/ 폴더로 인식된다. 내 컨텐츠는 웹 앱 폴더 안에 넣기만 하면 톰캣 서버가 알아서 읽어서 웹에 응답해줌.

 
인바운드 규칙 설정하기
고급 보안이 포함된 Window 방화벽> 인바운드 새 규칙 > TCP/IP 포트 8888
 
포트를 연 컴퓨터가 있다면 해당 컴퓨터의 아이피 주소로 들어가서 html 파일을 볼 수 있다.
http://아이피주소:포트번호/Hello/index.html
 
<16:30 7교시>
이클립스에서 자바스크립트 마크업을 쉽게 작성할 수 있게 해주는 기능을 추가로 설치하기 위해 아래링크의 내용을 진행한다.
Emmet — the essential toolkit for web-developers

Emmet — the essential toolkit for web-developers

Emmet — the essential toolkit for web-developers Emmet is a plugin for many popular text editors which greatly improves HTML & CSS workflow: Demo | @@@ tooltip: Type CSS-like abbreviation type: ul#nav>li.item$*4>a{Item $} wait: 1000 tooltip: Run “Expan

emmet.io

 
여기서 다운로드 > 이클립스를 누르면 아래의 링크가 나온다.
 
GitHub - emmetio/emmet-eclipse: Emmet for Eclipse

GitHub - emmetio/emmet-eclipse: Emmet for Eclipse

Emmet for Eclipse. Contribute to emmetio/emmet-eclipse development by creating an account on GitHub.

github.com

 

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.html</title>
</head>
<body>
	<h1>인덱스 페이지</h1>
	<p>내 이름은 : <strong>수정</strong></p>
	<img src="images/1.png">  <!-- 현재 위치를 기준으로 한 상대경로 이용해서 이미지 로딩 -->
	<img src="/Hello/images/1.png"> <!-- 톰캣서버내에서의 절대경로 이용해서 이미지 로딩 -->
	<img src="http://localhost:8888/Hello/images/1.png"><!-- 웹상에서의 절대경로를 이용해서 이미지 로딩 -->
	
</body>
</html>

 
 
아래만 만들면 404 에러가 발생함
 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.html</title>
</head>
<body>
	<h1>인덱스 페이지</h1>
	<p>내 이름은 : <strong>수정</strong></p>
	<img src="images/1.png">  <!-- 현재 위치를 기준으로 한 상대경로 이용해서 이미지 로딩 -->
	<img src="/Hello/images/1.png"> <!-- 톰캣서버내에서의 절대경로 이용해서 이미지 로딩 -->
	<img src="http://localhost:8888/Hello/images/1.png"><!-- 웹상에서의 절대경로를 이용해서 이미지 로딩 -->
	<ul>
	<li><a href="sub/play.html">놀러가기</a></li>
	</ul>
</body>
</html>

 

이것까지 만들어야 404 에러 없이 제대로 만들어짐.
 
지금 하고 있는 것은 상대 경로 연습
톰캣서버내에서의 절대 경로를 이용해서 로딩하는 것을 제일 많이 사용한다고 함.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.html</title>
</head>
<body>
	<h1>인덱스 페이지</h1>
	<p>내 이름은 : <strong>수정</strong></p>
	<img src="images/1.png">  <!-- 현재 위치를 기준으로 한 상대경로 이용해서 이미지 로딩 -->
	<img src="/Hello/images/1.png"> <!-- 톰캣서버내에서의 절대경로 이용해서 이미지 로딩, 제일 많이 사용함-->
	<img src="http://localhost:8888/Hello/images/1.png"><!-- 웹상에서의 절대경로를 이용해서 이미지 로딩 -->
	<ul>
	<li><a href="sub/play.html">놀러가기 with 상대경로</a></li>
	<li><a href="/Hello/sub/play.html">놀러가기 with 톰캣서버내 절대경로</a></li>
	<li><a href="http://localhost:8888/Hello/sub/play.html">놀러가기 with 웹상에서의 절대경로</a></li>
	</ul>
</body>
</html>

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>playplayplay</title>
</head>
<body>
	playplayplay
	<img src="../images/1.png">
	<!-- 여기에 <img src="images/1.png">라고 쓰면 이미지를 찾을 수 없다 상대 경로라서 -->
	<img src="/Hello/images/1.png"> <!-- 절대경로라서 똑같이 씀 -->
	<img src="http://localhost:8888/Hello/images/1.png"><!-- 절대경로라서 똑같이 씀 -->
	
	<ul>
		<li><a href="../index.html">상대경로로 인덱스로 돌아가기</a></li>
		<li><a href="/Hello/index.html">절대경로로 인덱스 들어가기</a></li>
		<li><a href="http://localhost:8888/Hello/index.html">절대경로로 인덱스 들어가기</a></li>
		<!-- 대문페이지는 따로 명시하지 않으면 자동으로 index.html 페이지가 응답된다 -->
		<li><a href="http://localhost:8888/Hello/">인덱스</a></li>
		<li><a href="/Hello/">인덱스</a></li>
	</ul>
</body>
</html>

 
 
 
 
<17:30 8교시> 
웹 프로그래밍 : 어떤 요청을 했을 때 어떤 응답을 할지만 프로그래밍하면 된다.
서버의 구조를 몰라도 이미 만들어진 구조를 활용하면 된다. (이럴거면 왜 배우고 있는건지 현타 또 오네)

package test.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

//3. 어떤 요청이 왔을 때 이 클래스로 생성된 객체로 응답을 할지 정해야 한다.
@WebServlet("/ping")
public class PingServlet extends HttpServlet{
	//이 클래스로 생성된 객체가 tomcat 서버에서 /ping 요청이 오면 직접 응답하도록 코딩해야 함...
	//이미 만들어진 서버의 부품으로 들어갈 클래스라 마음대로 만들면 안된다 -> 상속받거나 구현해서 만들어야 함
	//1. HttpServlet 추상 클래스를 상속 받음
	//2.부모의 service()메소드를 오버라이딩 한다
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//이 안의 내용이 /ping에 대한 요청이 있을 때 실행된다. arg0은 요청에 관련된 정보를, arg1은 응답에 필요한 객체의 도구를 작성
		//톰캣서버가 객체의 참조값을 전달해주고, 이 객체를 활용한 응답을 작성하기
		
		//클라이언트에게 문자열을 출력할 수 있는 객체를 얻어낸다.
		PrintWriter pw=response.getWriter();
		//핑요청을 한다면 그게 클라이언트의 웹브라우저에 출력된다.
		pw.println("pong");
		pw.close();
		
	}
}

 
 

 
 

근데 지금 응답으로 주어진 pong은 웹브라우저가 보기엔 html이 아니다.
근데 이 형태로 응답을 html로 작성하는 것은 고통이다.
 
코딩도 할 수 있고 html도 응답할 수 있는 해결책을 앞으로 배울 것인데. 일단은 무식하니까 아래 화면 같이 작성하는 수 밖에라고 하심...
 

package test.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

//3. 어떤 요청이 왔을때 이 클래스로 생성된 객체로 응답을 할지 정해야 한다.
@WebServlet("/ping")
public class PingServlet extends HttpServlet{//1. HttpServlet 클래스를 상속 받는다.
	
	//2. service() 메소드를 오버라이딩 한다.
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//클라이언트에게 문자열을 출력할수 있는 객체를 얻어낸다.
		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("<h1>pong!</h1>");
		pw.println("</body>");
		pw.println("</html>");
		pw.close();
	}
	
}