Spring_기본

song·2023년 10월 24일

Spring

목록 보기
3/19

라이브러리와 프레임워크

  • 라이브러리
    • jQuery는 라이브러리이다.
    • 하나의 결과에 도달하기 위해 사용할 수 있는 기능이 여러가지이다. (내 맘대로 선택 가능)
  • 프레임워크
    • Spring은 프레임워크다.
    • 정해져있는 형식에 맞춰서 사용해야 하는 것이다. (내 맘대로 할 수 없다. )
    • 규격화되어 있어서 협업하기 편하다.
    • 단점은 자유도가 없다.

bean

  • 스프링 컨테이너가 알아볼 수 있게 불러온 객체

어노테이션

  • @Controller : 원격 호출 가능한 프로그램으로 등록
  • @RequestMapping("/hello") : URL과 해당 메서드를 연결
    • Mapping URL이 겹치면 어떤것을 불러와야할 지 모르니까 에러난다.
    • 매핑 했다는 건 외부 접속이 가능하게 한다는 뜻이다. 그러므로 인스턴스화 시키지 않아도 static이 아니어도 바로 실행되며, private으로 해놔도 의미없다.
      • 클래스 정보를 얻을 수 있는 Reflection API를 사용하기 때문에 private이어도 호출 가능하다.

Reflection

  • java.lang.reflect
  • Class.forName()
    • Hello 클래스의 class 객체(클래스의 정보를 담고있는 객체)를 얻어온다.
    • 클래스를 미리 알지 못해도 클래스를 실시간으로 로드할 수 있다.
  • newInstance()
    • 동적 객체 생성
    • class 객체를 이용하면 new 연산자없이 그때그때 필요한 개체를 생성할 수 있다.
      편하긴 한데 이 방법은 코드상에서는 클래스 이름을 우리가 정 할수 없다.
    • 메모리상에 무조건 하나만 존재 가능.
    • 기존 인스턴스를 재활용하기 때문에 성능 향상을 기대할 수 있다.

메서드 밖에서 호출하기.

  • 다른 class클래스에 있는 메서드들을 밖에서 호출할 수 있게 해보기.
Method m = clazz.getDeclaredMethod("다른 메서드");
m.setAccessible(true);
m.invoke(hello);
  • setAccessble() : private한 메서드에 접근가능하게 하기.
  • invoke() : 실행.

터미널 실행하기

  • 죄측 Package Explorer 탭의 target 마우스 우클릭 > Show in > terminal (Ctal + Alt + T)
  • cd classes 치고
  • java 패키지.java파일명 String args[]에 보낼 값 적기
package com.bitstudy.app;

import java.util.Calendar;

/** 년월일 입력하면 요일 출력하는 어플리케이션 만들기 */

public class Ex02_1_YoilTeller {

	public static void main(String[] args) {
//		1. 입력
			String s_year = args[0];
			String s_month = args[1];
			String s_date = args[2];
			
			// 문자열로 받았으니깐 숫자로 형변환
			int year = Integer.parseInt(s_year);
			int month= Integer.parseInt(s_month);
			int date = Integer.parseInt(s_date);
		
//		2. 연산
/** 		자바에서 기본으로 제공하는 Calendar 클래스. 추상클래스라서 new를 이용한 인스턴스화 불가
 * 			getInstance() 는 인스턴스를 만들어줌 (new 랑 비슷한애)
 * 			new 로 만드는 것과 차이점: 최초에 할당된 메모리를 재사용 하느냐(getInstance) 못하느냐(new)의 차이
 *  */
			Calendar cal = Calendar.getInstance(); // 추상클래스라서 new 못쓰고 getInstance() 메소드 이용해서 사용
			cal.set(year, month-1, date);
			
			int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1~7 사이의 숫자로 나옴
			char yoil = " 일월화수목금토".charAt(dayOfWeek);  // 주 중에 몇번째 일 {"","일","월","화","수","목","금","토"}
			
			
//		3. 출력(view)
			System.out.println(year +"년"+month +"월"+date+"일은");
			System.out.println(yoil+" 요일 입니다.");
			
/*	실행하는 방법
 *  죄측 Package Explorer 탭의 target 마우스 우클릭 > Show in > terminal (Ctal + Alt + T)
 *  cd classes 치고
 *  java com.bitstudy.app.Ex02_1_YoilTeller 2023 10 24
 * */
	}
}

외부(브라우저)에서 main 메서드 접근

  1. 클래스를 컨트롤러로 등록 - @Controller
  2. 메인메소드 맵핑 - @requestMapping
  3. main(String args[])를 main(HttpServletRequest request)로 변경
  • 원격 프로그램을 브라우저에서(URL입력) 호출하면 톰캣이 HttpServletRequest객체를 만들어서 들어오고 있는 정보를 해당 객체에 저장한다.
    저장한 데이터를 맵핑된 메서드에 매개변수로 넘겨준다.
    1. 요청 받을 때 전달받은 정보를 HttpServletRequest객체를 생성해서 저장
    2. 웹브라우저에 응답을 돌려줄 HttpServletResponse객체를 생성(빈 객체)
    3. 생성된 HttpServletRequest(정보가 저장)와 HttpServletResponse(비어있는)를 Servlet에 전달.
      HttpServletRequest : request 객체는 JSP에서 가장 많이 사용되는 객체. 모든 정보는 여기에 저장됨.
package com.bitstudy.app;

import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/** 년월일 입력하면 요일 출력하는 어플리케이션 만들기 */
@Controller
public class Ex02_2_YoilTeller {

	@RequestMapping("/getYoil") //localhost:8080/app/getYoil?year=2023&month=10&date=24
	public static void main(HttpServletRequest request) {
//		1. 입력
			String s_year = request.getParameter("year");
			String s_month = request.getParameter("month");
			String s_date = request.getParameter("date");
			
			// 문자열로 받았으니깐 숫자로 형변환
			int year = Integer.parseInt(s_year);;
			int month= Integer.parseInt(s_month);
			int date = Integer.parseInt(s_date);
		
//		2. 연산
/** 		자바에서 기본으로 제공하는 Calendar 클래스. 추상클래스라서 new를 이용한 인스턴스화 불가
 * 			getInstance() 는 인스턴스를 만들어줌 (new 랑 비슷한애)
 * 			new 로 만드는 것과 차이점: 최초에 할당된 메모리를 재사용 하느냐(getInstance) 못하느냐(new)의 차이
 *  */
			Calendar cal = Calendar.getInstance(); // 추상클래스라서 new 못쓰고 getInstance() 메소드 이용해서 사용
			cal.set(year, month-1, date);
			
			int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1~7 사이의 숫자로 나옴
			char yoil = " 일월화수목금토".charAt(dayOfWeek);  // 주 중에 몇번째 일 {"","일","월","화","수","목","금","토"}
			
			
//		3. 출력(view)
			System.out.println(year +"년"+month +"월"+date+"일은");
			System.out.println(yoil+" 요일 입니다.");
	}
}
  • request.getRequestURL() : 현재주소값을 불러온다.

연산 결과를 외부에 응답하기.

  1. response 객체를 생성해서 브라우저에 응답.
    메인 메서드 매개변수에 'HttpServletResponse response' 추가
    public static void main(HttpServletRequest request, HttpServletResponse response) {}
  2. 출력부분에 response 사용
    • Servlet은 HttpServletResponse 객체에 Content Type, 응답코드, 응답메세지등을 담아서 전송됨.
    • 브라우저는 내가 보내주는게 텍스트인지 바이너리인지 모르기 때문에 아래 응답형식과 인코딩 형식들 전달해줘야함.
      //response.setContentLength("text/html; charset=utf-8"); // 아래 두 줄로 분리 가능
      response.setContentType("text/html"); //응답 형식을 html로 지정
      response.setCharacterEncoding("utf-8"); //응답의 인코딩 형식을 UTF-8로 지정. (이거 안하면 한글 깨져서 나옴. )
    • PrintWriter out = response.getWriter(); 생성해서 출력.
package com.bitstudy.app;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/** 요일 연산 결과를 외부에 응답하기.  */
@Controller
public class Ex02_3_YoilTeller {

	@RequestMapping("/getYoil2") //localhost:8080/app/getYoil2?year=2023&month=10&date=24
	public static void main(HttpServletRequest request, HttpServletResponse response) throws Exception {
//		1. 입력
			String s_year = request.getParameter("year");
			String s_month = request.getParameter("month");
			String s_date = request.getParameter("date");
			
			// 문자열로 받았으니깐 숫자로 형변환
			int year = Integer.parseInt(s_year);;
			int month= Integer.parseInt(s_month);
			int date = Integer.parseInt(s_date);
		
//		2. 연산
/** 		자바에서 기본으로 제공하는 Calendar 클래스. 추상클래스라서 new를 이용한 인스턴스화 불가
 * 			getInstance() 는 인스턴스를 만들어줌 (new 랑 비슷한애)
 * 			new 로 만드는 것과 차이점: 최초에 할당된 메모리를 재사용 하느냐(getInstance) 못하느냐(new)의 차이
 *  */
			Calendar cal = Calendar.getInstance(); // 추상클래스라서 new 못쓰고 getInstance() 메소드 이용해서 사용
			cal.set(year, month-1, date);
			
			int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1~7 사이의 숫자로 나옴
			char yoil = " 일월화수목금토".charAt(dayOfWeek);  // 주 중에 몇번째 일 {"","일","월","화","수","목","금","토"}
			
			
//		3. 출력(view)
			/*
			 Servlet은 HttpServletResponse 객체에 Content Type, 응답코드, 응답메세지등을 담아서 전송됨. 
			 브라우저는 내가 보내주는게 텍스트인지 바이너리인지 모르기 때문에 아래 응답형식과 인코딩 형식들 전달해줘야함. 
			 */
			
			//response.setContentType("text/html; charset=utf-8"); // 아래 두 줄로 분리 가능
			response.setContentType("text/html"); //응답 형식을 html로 지정
			response.setCharacterEncoding("utf-8"); //응답의 인코딩 형식을 UTF-8로 지정. (이거 안하면 한글 깨져서 나옴. )
			
			PrintWriter out = response.getWriter(); //브라우저로 출력
			out.println("<html>");
			out.println("<head>");
			out.println("</head>");
			out.println("<body>");
			
			out.println(year +"년"+month +"월"+date+"일은");
			out.println(yoil+" 요일 입니다.");
			
			out.println("</body>");
			out.println("</html>");
	}

}

에러코드

  • 100번대 : 클라이언트와 서버와의 정보교환 관련 에러
  • 200번대 : 성공
  • 300번대 : 다른 URL로 요청해라 (잘못된 페이지 왔다는 정도)
    • 리다이렉트 에러
  • 400번대 : 클라이언트 쪽 에러 (사용자가 요청을 잘 못한 케이스. ex) 페이지 경로(url) 잘 못 쓴 것)
    • 사용자는 경로만 잘 찾아오면 됨.
  • 500번대 : 서버쪽 에러 (서버에서 처리하다가 에러난 것. ex) 페이지는 잘 찾아왔지만 정보를 안넣어서 코드상 에러남)
    • 서버쪽에서는 사용자가 정보를 잘 못 넣는 것까지 생각해서 코드를 짜놔야 함.
profile
계속 나아가기

0개의 댓글