11주차 02월 07일 Maven

하이·2023년 2월 7일
0

수업

목록 보기
22/41
post-custom-banner

Maven

: Servlet의 실행 mechanism
: Build Tool
: Maven - (Spring Legacy Project)
: Maven/Gradel - (Spring boot)
: Ant - x

Build란?

Build는 우리가 작성한 source code를 실행할 수 있는 독립적인 형태로 변환하는 과정 + 결과물

Build과정

① 프로젝트 생성
: 이 과정을 조금 더 효율적으로 처리하기 위해 Maven
라이브러리 생성
③ code 작성
④ compile 과정 : 기계가 인식할 수 있도록하는 과정
⑤ Test 과정
⑥ Packaging 과정
⑦ 배포

  1. maven download
    https://maven.apache.org/download.cgi

  2. 환경변수 설정

    /Library/Java/apache-maven-3.9.0
    vi ~/.zshrc : zsh 편집기 열기
    I : insert mode
    :wq : 저장하고 나오기
    source ~/.zshrc: 적용 꼭 꼭

  3. maven-test 폴더 생성 후
    -> 터미널에

    mvn archetype:generate -DgroupId=com.test -DartifactId=myProject -DarchetypeArtifactId=maven-archetype-quickstart

-> ~maven-test폴더에 myProject폴더 생성~

-> Maven으로 생성된 Java project 컴파일

mvn compile

4.pom.xml 수정

-> Maven으로 생성된 Java project 컴파일

mvn compile

-> 5.

mvn package

->

java -cp myProject-1.0-SNAPSHOT.jar com.test.App



이클립스에 import



eclipse에서 Maven 연동(Project 만들기)

이렇게 하면 됨..^^
1. 프로젝트 생성

configure-convert to maven project

2. pom.xml 설정

: <dependencies></dependencies> 추가

https://mvnrepository.com/search?q=tomcat9+servlet
https://mvnrepository.com/

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.test</groupId>
	<artifactId>MyWebProject</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	
	
	<dependencies>
		<!-- 여기에 필요한 라이브러리를 포함시켜야함 -->
		<!-- Servlet에 대한 library를 포함시켜야 함
			 우리는 Tomcat9 버전 안에 있는 Servlet -->
		<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-servlet-api</artifactId>
			<version>9.0.71</version>
		</dependency>
		
		
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.28</version>
		</dependency>
	</dependencies>
	
	
	
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.2.3</version>
			</plugin>
		</plugins>
	</build>
</project>

여기가 maven의 repository


Java project 생성

servlet instance는
최초의 한번만 생성함
계속 생성하면 느려지고, 컴퓨터가 감당할 수 없어짐

package container;

import ThreadInvoker.ClientThread;
import arguments.HttpServletRequest;
import arguments.HttpServletResponse;

// Tomcat(WAS) 안에 Servlet Container역할을 하는 클래
public class ServletContainer {
	//	일반 자바 프로그램이기 때문에 있는거고,
	//	실제로 Servlet Container는 가지고 있지 않음
	public static void main(String[] args) {
	
		// 1. 사용자의 요청사항(request)을 분석
		//	  어떤 서블릿을 실행하는지 알아내기 => Add Servlet을 실행 !
		
		// 2. Add라는 서블릿의 instance가 있는지 확인
		//	  Container안에 객체가 있는지 확인
		
		// 3. 객체가 없기 때문에 Add Servlet을 찾아서 객체를 생성함
		AddServlet servlet = new AddServlet(); 
		
		// 4. Servlet instance가 생성되면 바로 다음에 해당 서블릿의 init()를 호출함
		// init : 서블릿의 초기화 담당
		servlet.init();
		
		// 5. 클라이언트가 보내준 request내용을 기반으로 객체를 하나 생성
		//	  당연히 이 객체에는 클라이언트가 보내준 데이터가 들어가 있어야함
		HttpServletRequest request = new HttpServletRequest();

		// 6. 클라이언트에게 최종 결과를 보내주기 위해 response객체를 하나 만들어야 함
		HttpServletResponse response = new HttpServletResponse();
		
		// 7. 클라이언트요청을 실제로 처리하기 위해 Thread가 있어야 함
		// servlet, request, response 세개를 인자로 넘겨 줌
		ClientThread thread = new ClientThread(servlet, request, response);
		thread.start(); // thread 기동
	}
}
package container;

import arguments.HttpServletRequest;
import arguments.HttpServletResponse;

// Servlet(서블릿)이라고 불리는 이 클래스는
// 원래 특정 클래스(HttpServlet)를 상속해서 만들어야 함
public class AddServlet {

	public void init() {
		//	Servlet init 초기화를 담당
		//	생성자에서 하지않고 여기서 함

	}
	
	public void service(AddServlet servlet, HttpServletRequest request, HttpServletResponse response) {
		// 이 메소드는 이미 하는 일이 정해져 있음
		// request 객체를 뒤져서, 클라이언트의 요청방식이 어떤 방식인지 알아낸다
		// 만약 GET 방식이면 =>
		// doGet(request, response);
		// 만약 POST 방식이면
		doPost(request, response);

	}
	
	public void doGet(HttpServletRequest request, HttpServletResponse response) {
		// 여기에서 request객체와 response객체를 이용해
		// 입력처리, 로직처리, 출력처리를 진행 !

	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub

	}
}
package ThreadInvoker;

import arguments.HttpServletRequest;
import arguments.HttpServletResponse;
import container.AddServlet;

public class ClientThread extends Thread {
	
	private AddServlet servlet;
	private HttpServletRequest request;
	private HttpServletResponse response;
	
	public ClientThread(AddServlet servlet,HttpServletRequest request,HttpServletResponse response) {
		// TODO Auto-generated constructor stub
	}
	
	@Override
	public void run() {
		// TODO Auto-generated constructor stub
	}
}
package arguments;

public class HttpServletRequest {

}
package arguments;

public class HttpServletResponse {

}

Dynamic Web Project

  1. web project 생성
    context root : 우리 project를 client가 web상에서 식별하기 위한 논리적인 이름
    -> first

  2. maven project로 바꾸기

  3. pom.xml에 dependencies 추가

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>HelloWorld</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  
  <dependencies>
	  <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-servlet-api</artifactId>
			<version>9.0.71</version>
		</dependency>
  </dependencies>

  
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
      </plugin>
    </plugins>
  </build>
</project>

  1. servlet code 생성
    : url mapping 우리 servlet을 클라이언트가 web상에서 식별하기 위한 논리적인 이름
    servlet은 컨트롤러(클라이언트가 하는 이벤트/행위/데이터를 받아서 비즈니스로직(모델)과 연결하는 역할)
    ->

HelloWorldServlet.java

package controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;

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

/**
 * Servlet implementation class HelloWorldServlet
 */
@WebServlet("/HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloWorldServlet() {
        super();
        
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
		// GET방식이 호출되면, 결국 돌고 돌아서 이 method가 Thread에 의해 호출됨
		// 1. 클라이언트가 보내준 데이터를 받음 => request객체 이용
		// 2. 로직처리를 함 (DB처리 포함)
		// 3. 출력처리를 함 => response객체를 이용
		//		1. 처리된 결과를 보내주기 전에,
		//		   먼저 처리한 결과가 어떤데이터인지를 먼저 알려줘야함
		response.setContentType("text/html; charset=UTF-9");
		//		2. 실제 결과 데이터를 전송하면 됨
		//		   네트워크를 통해서 전송해야 하기때문에 stream을 열어서 데이터를 전송함 !
		PrintWriter out = response.getWriter();
		out.println("<html><head></head><body>까꿍?ㅋ</body></html>");
		out.close(); 	// stream을 닫아줌
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

GET방식으로 request를 보내야함
add 후 서버 기동


Parameter 전달(Data 전달)
client가 Servlet에게 Data를 전달하고 싶어요 !
web에서 URL뒤에 특정문자열(Query String)을 이용해서 Data를 전달하는 방법
GET방식 : ? key=value&key=value&...
문제) 클라이어언트가 2개의 숫자를 보내요! 그 합의 결과를 알려주는 Servlet 작성

package controller;

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

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

/**
 * Servlet implementation class AddServlet
 */
@WebServlet("/sum")
public class AddServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AddServlet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 이 서블릿을 호출하려면 
		// http://127.0.0.1:8080/first/sum?num1=10&num2=20
		
		// 1. 입력처리
		// Query String으로부터 데이터를 받으려면
		// 입력받은 데이터는 무조건 문자열 ! 임을 기억해야함
		String num1 = request.getParameter("num1");	// "10"
		String num2 = request.getParameter("num2");	// "20"
		
		// 2. 로직처리
		int sum = Integer.parseInt(num1) + Integer.parseInt(num2);
		
		
		// 3. 출력처리
		response.setContentType("text/html; charset=UTF-8");
	    // "text/html; charset=UTF-8" -> 문자열이라는 뜻이다. html;-> 오류나면 다운로드 창이 뜬다.
	    // 실제 결과 데이터를 전송해야 하기 때문에 stream을 열어서 데이터 전송!
	    PrintWriter out = response.getWriter();
	    out.println("<html><head></head><body>" + sum + "</body></html>");
	    out.close();
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

package controller;

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

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

/**
 * Servlet implementation class AddServlet
 */
@WebServlet("/sum")
public class AddServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public AddServlet() {
		super();
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
//		// 이 서블릿을 호출하려면
//		// http://127.0.0.1:8080/first/sum?num1=10&num2=20
//
//		// 1. 입력처리
//		// Query String으로부터 데이터를 받으려면
//		// 입력받은 데이터는 무조건 문자열 ! 임을 기억해야함
//		String num1 = request.getParameter("num1"); // "10"
//		String num2 = request.getParameter("num2"); // "20"
//
//		// 2. 로직처리
//		int sum = Integer.parseInt(num1) + Integer.parseInt(num2);
//
//		// 3. 출력처리
//		response.setContentType("text/html; charset=UTF-8");
//		// "text/html; charset=UTF-8" -> 문자열이라는 뜻이다. html;-> 오류나면 다운로드 창이 뜬다.
//		// 실제 결과 데이터를 전송해야 하기 때문에 stream을 열어서 데이터 전송!
//		PrintWriter out = response.getWriter();
//		out.println("<html><head></head><body>" + sum + "</body></html>");
//		out.close();

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	
		// 1. 입력처리
		// http://127.0.0.1:8080/first/sum
		// Form으로부터 Post방식으로 데이터를 받으려면
		// 입력받은 데이터는 무조건 문자열 ! 임을 기억해야함
		String num1 = request.getParameter("myNum1"); // html과 servlet의 내용이 매칭이되야함 myNum1
		String num2 = request.getParameter("myNum2"); // "20"

		// 2. 로직처리
		int sum = Integer.parseInt(num1) + Integer.parseInt(num2);

		// 3. 출력처리
		response.setContentType("text/html; charset=UTF-8");
		// "text/html; charset=UTF-8" -> 문자열이라는 뜻이다. html;-> 오류나면 다운로드 창이 뜬다.
		// 실제 결과 데이터를 전송해야 하기 때문에 stream을 열어서 데이터 전송!
		PrintWriter out = response.getWriter();
		out.println("<html><head></head><body>" + sum + "</body></html>");
		out.close();
	}

}

profile
기록의 즐거움 😆💻
post-custom-banner

0개의 댓글