라이브러리와 프레임워크
- 라이브러리
- 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 메서드 접근
- 클래스를 컨트롤러로 등록 - @Controller
- 메인메소드 맵핑 - @requestMapping
- main(String args[])를 main(HttpServletRequest request)로 변경
- 원격 프로그램을 브라우저에서(URL입력) 호출하면 톰캣이 HttpServletRequest객체를 만들어서 들어오고 있는 정보를 해당 객체에 저장한다.
저장한 데이터를 맵핑된 메서드에 매개변수로 넘겨준다.
- 요청 받을 때 전달받은 정보를 HttpServletRequest객체를 생성해서 저장
- 웹브라우저에 응답을 돌려줄 HttpServletResponse객체를 생성(빈 객체)
- 생성된 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() : 현재주소값을 불러온다.
연산 결과를 외부에 응답하기.
- response 객체를 생성해서 브라우저에 응답.
메인 메서드 매개변수에 'HttpServletResponse response' 추가
public static void main(HttpServletRequest request, HttpServletResponse response) {}
- 출력부분에 response 사용
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) 페이지는 잘 찾아왔지만 정보를 안넣어서 코드상 에러남)
- 서버쪽에서는 사용자가 정보를 잘 못 넣는 것까지 생각해서 코드를 짜놔야 함.