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

자바 풀 스택 1/6 오전 기록 031-1

파티피플지선 2025. 1. 6. 15:05

9:22 학원 도착
주말에 오버워치 신나게 해버렸더니 너무 힘든 아침이다...ㅋㅋㅋㅋㅋㅋㅋ 아...
운동을 하던 옵치를 하지 않던 어케든 체력을 잘 유지보수하는 길을 찾아야지.
 
 
 
<9:30 1교시> 지난주에 새로 배운 부분 복습
/서버프로젝트이름   은 context path로서 webapp을 가리키며, 이것은 즉, 문맥상의 위치를 나타낸다.
실제 존재하는 파일이 아닌 경로로서의 요청이 있을 수도 있다.
이런건 서블릿으로 요청에 대해 응답하는 동작을 해준다.
 

 
링크를 눌렀을 때 진행되는 과정
클라이언트가 최초로  "/fortune" 요청을 해오면 tomcat 서버가 new FortuneServlet() 명령으로 객체(얘를 Obj라 하면)를 생성해서 해당 객체의 service() 메소드를 알아서 호출해준다.
이후 다른 클라이언트가 "/fortune" 요청을 다시 해도 FortuneServlet 객체를 새로 생성하지 않고 기존에 생성되었던 객체(아까 만든 Obj)를 다시 사용한다.
 
service() 메소드에는 HttpServletRequest 객체와 HttpServletResponse 객체의 참조값이 매개 변수에 전달됨.
해당 메소드 안에서 요청에 관련된 작업을 하려면, HttpServletRequest 객체를 활용하면 되고
클라이언트에게 응답하는 것과 관련된 작업을 하려면 HttpServletResponse 객체를 활용하면 된다.
 
웹브라우저와 웹서버가 대화하는걸 계속 생각해라.
서블릿이 서버의 역할을 한다.
웹브라우저는 클라이언트로서 항상 요청한다. (요청 방식 : 주소창에 입력하거나 링크를 누르거나 폼을 제출하거나 등)
서버는 이에 대해 항상 응답해준다.(응답 방식 : jsp, 서블릿 등)
지금 우리의 컴퓨터는 웹브라우저와 서버가 같은 컴퓨터에서 공존하는 형태의 작업장 상태이다.
같은 컴퓨터에 있지만 웹 브라우저와 컴퓨터가 별개의 컴퓨터에 있다고 생각하고 프로그래밍을 진행해야 한다.
 
+앞으로는 데이터베이스에서 읽어온 데이터를 응답하는 걸 연습할 거임(using dto, dao)
 
 
 

.getParameter("전송되는 파라미터명")  메소드는 get 방식, post 방식 전송 파라미터를 모두 추출 가능하다.
 
get 방식과 post 방식의 차이를 알아야 한다.
주소창의 파라미터에 데려가는 get 방식과 주소창이 아닌 몸통에 데려가는 post 방식.
 
 
 
jsp
요청경로(주소창)을 볼 때    이름.jsp 라는 형태로 보임.
실제로 그 위치에 이 jsp 페이지가 존재하면 됨.
 
맨 위에 한줄 빼고는 html과 닮아 있는데,  <%    %> 기호의 영역 안쪽에 요청 파라미터를 추출하거나 DB에 연동하는 등 자바의 코딩을 할 수 있다는 독특한 특징을 가짐.
<%  %>라는 특정 영역이 아니고 그냥 작성된 문자열은 무조건 모두 다 - 심지어 개행기호까지 포함한 내용 그대로 html처럼 바뀌어서 클라이언트에게 출력됨.
 
 
 
<10:30 2교시>jsp 이어서
<%@ %>영역  : jsp 문서의 가장 위에 부분
<%%> 영역 : 특별한 자바 코딩이 가능한 부분
<%=  %> > 영역 : 위의 영역 안의 내용을 간단하게 줄인 것
 
client 가 /send.jsp를 요청하니까 아래의 문자열이 응답되었다.

클라이언트 입장에서는 <%   %>인지 <%=  %>인지 관심이 없다. 서버의 관점에서는 그게 중요하다.
 
 
[ 서버의 관점 ]
클라이언트가 "/send.jsp" 경로 요청을 한다 → /webapp/send.jsp 페이지로 응답하는데 이걸 이 페이지에 있는 소스코드 그대로 응답해주는 게 아니라 send.jsp 페이지를 해석한 결과가 응답된다
 
- 해석한 결과의 의미 :
send.jsp 페이지를  class  send_jsp 클래스로 변환했다는 의미. send_jsp클래스는 서블릿이고, 이 말은 즉, send_jsp 서블릿 객체로 응답을 했다는 의미이다.
서블릿의 문제점 : html 형식으로 응답하기가 너무 불편했어서 이걸 해결하기위해 jsp 페이지를 작성.
 
 
jsp의 <% %> 영역 부분은 서블릿의   service()  메소드 안쪽 영역이라고 생각하고 코딩하면 된다.
service() 메소드 안쪽에선 HttpServletRequest 객체와 HttpServletResponse 객체가 전달되는데, <% %> 영역 안에서 Ctrl + Space를 눌러보면 그 두 가지 객체 외에도 이미 jsp 기본 객체 8가지가 지역 변수에 들어있어서 전달되어 있는 것을 확인할 수 있는데, 우리가 service()에서 쓰던 request. 이나 response. 을 써서 바로 사용하면 된다.
 
JSPWirter 객체인 out.은 사실 직접 사용할 일이 크게 없는데 그 이유는 그냥 html 유사 영역 부분에 작성하면 그대로 클라이언트에 전달되기 때문.
 
서버에서 send.jsp가 알아서 send_jsp 객체로 변경되어서 출력되는 것.

더보기
/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/10.1.34
 * Generated at: 2025-01-03 08:15:41 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.jsp.*;

public final class send_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports,
                 org.apache.jasper.runtime.JspSourceDirectives {

  private static final jakarta.servlet.jsp.JspFactory _jspxFactory =
          jakarta.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.LinkedHashSet<>(4);
    _jspx_imports_packages.add("jakarta.servlet");
    _jspx_imports_packages.add("jakarta.servlet.http");
    _jspx_imports_packages.add("jakarta.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile jakarta.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public boolean getErrorOnELNotFound() {
    return false;
  }

  public jakarta.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final jakarta.servlet.http.HttpServletRequest request, final jakarta.servlet.http.HttpServletResponse response)
      throws java.io.IOException, jakarta.servlet.ServletException {

    if (!jakarta.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      final java.lang.String _jspx_method = request.getMethod();
      if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP들은 오직 GET, POST 또는 HEAD 메소드만을 허용합니다. Jasper는 OPTIONS 메소드 또한 허용합니다.");
        return;
      }
    }

    final jakarta.servlet.jsp.PageContext pageContext;
    jakarta.servlet.http.HttpSession session = null;
    final jakarta.servlet.ServletContext application;
    final jakarta.servlet.ServletConfig config;
    jakarta.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    jakarta.servlet.jsp.JspWriter _jspx_out = null;
    jakarta.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write('\r');
      out.write('\n');

	String fortuneToday="서쪽으로 가면 강남역을 만나요!";
	//요청 파라미터 추출
	String msg=request.getParameter("msg");
	//콘솔에 출력 
	System.out.println(msg);

      out.write("\r\n");
      out.write("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta charset=\"UTF-8\">\r\n");
      out.write("<title>/send.jsp</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write(" 	<h1>나는 jsp 페이지</h1>\r\n");
      out.write(" 	<p> 오늘의 운세 : <strong>");
out.print(fortuneToday); 
      out.write("</strong></p>\r\n");
      out.write(" 	<p> 오늘의 운세 : <strong>");
      out.print(fortuneToday );
      out.write("</strong></p>\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof jakarta.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

 
jsp 에서 코딩 활용하기 


 
 
 

 
 
지난주에 하려던거 내가 하던 거랑 다른 거 해주신 선생님 코드 백업

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//DB 에서 읽어온 친구 목록이라고 가정하자
	List<String> names=new ArrayList<>();
	names.add("김구라");
	names.add("해골");
	names.add("원숭이");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>webapp/friends.jsp</title>
</head>
<body>
	<h1>친구 목록</h1>
	<ul>
		<%for(String tmp:names){ %>
			<li><%=tmp %></li>
		<%} %>
	</ul>
</body>
</html>

 
내 삽질 코드는 방금 답이랑 다른거니까 일단 숨겨두고... 다시 해보기...

더보기
<%@page import="java.io.PrintWriter"%>
<%@page import="test.dto.MemberDto"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<% 
List<MemberDto> list = new ArrayList<>(); 
list.add(new MemberDto(1, "이름1", "주소1"));
list.add(new MemberDto(2, "이름2", "주소2"));
list.add(new MemberDto(3, "이름3", "주소3"));
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter pw = response.getWriter();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>친구목록</h1>
	<table>
		<tr>
			<th>번호</th>
			<th>이름</th>
			<th>주소</th>
		</tr>
		<% 
			for (MemberDto tmp:list){
			pw.println("<tr><td>"+tmp.getNum()+"</td><td>"+tmp.getName()+"</td><td>"+tmp.getAddr()+"</td>"); 
			}
		%>
	
	
	</table>
</body>
</html>

 
 
<11:30 3교시>
 
 
 
 
 
어제 삽질했던거를 다시 코딩한거. 내가 스스로 한거랑 답 비교해봐야 함.
 

<%@page import="java.io.PrintWriter"%>
<%@page import="test.dto.MemberDto"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<% 
List<MemberDto> list = new ArrayList<>(); 
list.add(new MemberDto(1, "이름1", "주소1"));
list.add(new MemberDto(2, "이름2", "주소2"));
list.add(new MemberDto(3, "이름3", "주소3"));
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter pw = response.getWriter();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>친구목록</h1>
	<table>
		<tr>
			<th>번호</th>
			<th>이름</th>
			<th>주소</th>
		</tr>
		<% 
			for (MemberDto tmp:list){ %>
		<tr>
			<td><%=tmp.getNum()%></td>
			<td><%=tmp.getName()%></td>
			<td><%=tmp.getAddr()%></td> 
		</tr>
		<%  }%>
	
	
	</table>
</body>
</html>

 
근데 이거 코딩 페이지는 제대로 나오는데 연결이 안되어서 당황했다가 member라는 폴더 만들고 그 안에다가 list.jsp 만드니까 연결되더라.

 
아래는 방금 내가 한거 선생님이랑 같이 한거. 테이블 html 코딩할 때 thead와 tbody 나눠주는거 안했음...

<%@page import="java.io.PrintWriter"%>
<%@page import="test.dto.MemberDto"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<% 
List<MemberDto> list = new ArrayList<>(); 
list.add(new MemberDto(1, "이름1", "주소1"));
list.add(new MemberDto(2, "이름2", "주소2"));
list.add(new MemberDto(3, "이름3", "주소3"));
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter pw = response.getWriter();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>친구목록</h1>
	<table>
		<thead>
			<tr>
				<th>번호</th>
				<th>이름</th>
				<th>주소</th>
			</tr>
		</thead>
		<tbody>
			<% 
				for (MemberDto tmp:list){ %>
			<tr>
				<td><%=tmp.getNum()%></td>
				<td><%=tmp.getName()%></td>
				<td><%=tmp.getAddr()%></td> 
			</tr>
			<%  }%>
		</tbody>
	
	</table>
</body>
</html>

 
데이터베이스에서 읽어온 내용을 웹페이지에 출력하는 작업하기

 
1. Connection 객체가 필요하다
2. Dto가 필요하다
3. Dao가 필요하다
 
서버에서는 Connection 얻어오는 방법이 다르다.
DB 연동할 때 사용했던 jar 파일을 복사해서 webapp>web-inf 폴더의 lib에 Ctrl+v 붙여넣기
 

 
Apache Tomcat 10 (10.1.34) - JNDI Datasource How-To

Apache Tomcat 10 (10.1.34) - JNDI Datasource How-To

JNDI Datasource configuration is covered extensively in the JNDI-Resources-HOWTO. However, feedback from tomcat-user has shown that specifics for individual configurations can be rather tricky. Here then are some example configurations that have been poste

tomcat.apache.org

 
 
우리꺼는 TIGER로 바꿔주고 1521:mysid 대신에 1521:xe 입력
 
 
 

 

 

 
 
 
<12:30 4교시>
새로운 테스트 프로젝트를 만들어서 index.jsp 페이지를 webapp 폴더에 만들고
link 또는 form 을 구성해서 요청하도록 만들고 서블릿, jsp 페이지에서 응답하는 연습해보기
 
 
index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My page</title>
<style>
	h1{backgroundcolor:orange;}
</style>
</head>
<body>
	<h1>Welcome to Crystal's Web Page</h1>
		
	<ul>
		<li><a href="booktoread.jsp">list of books to read</a></li>
		<li><a href="playlist.jsp">list of my favorite music</a></li>
	
	</ul>
	
</body>
</html>

 
 
 
 
booktoread.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>list of books to read</title>
</head>
<body>
	<h1>list of books to read</h1>
	<ul>
		<li>Anxiety</li>
		<li>Algorithms</li>
	</ul>
	
	<input type="text" />
	<button type="submit">add to list</button>
	
</body>
</html>