6/21 프로젝트 3차

박세현·2024년 6월 21일
0

3차 프로젝트

목록 보기
11/14
post-thumbnail

1. BeanContainer.java

  • 객체 조립기, 객체 자동 스캔 및 생성
  • 스캔 방법은 애노테이션
  • @Controller, @RestController, @Component, @Service이 있으면 객체 생성

  • @Controller : 요청시 유입되는 컨트롤러
    • 출력 : jsp
    • 반환값 : 문자열
  • @RestController 요청시 유입되는 컨트롤러
    • 출력 : JSON - {"이름":"값", ...}
    • 반환값 : 자바 객체

  • DispatcherServlet : 모든 요청과 응답의 창구 - /
    • 모든 요청은 DispatcherServlet으로 들어온다
    • 다만 요청 주소에 따라 유입되는 컨트롤러는 다름


2. HandlerMapping - HandlerMappingImpl

  • 요청 주소와 요청 방식(Method - GET, POST, PATCH, PUT, DELETE) 정보를 가지고 컨트롤러 객체(@Controller, @RestController)와 요청 메서드를 찾아 주는 역할
    -> 찾았으면 이 요청메서드를 실행해야 함
    = HandlerAdapter - HandlerAdapterImpl
	@Controller
	@RequestMapping("/member")
	public class MemberController {
		...

		@GetMapping("/join")
		public String join(RequestJoin form) {
			...
		}
	}
	
	GET /member/join
	
	
	@Controller
	public class MemberController {
		...

		@GetMapping("/member/join")
		public String join(RequestJoin form) {
			...
		}
	}
	
	GET /member/join


3. HandlerAdapter - HandlerAdapterImpl

  • 찾은 컨트롤러 객체의 메서드를 실행

  • 보통 요청이 들어오면 사용자 요청 데이터가 있을 것

  • 보통 요청 데이터를 조회 할 때는 HttpServletRequest에 있는 getParameter를 가지고 조회 -> 전부다 값이 문자열

  • 요청 메서드에 정의된 매개변수 유형에따라 요청 데이터를 자료형에 맞게 자동 주입 -> 실행

  • 서블릿 기본 객체도 매개변수에 정의되어 있으면 자동 주입(HttpServletRequest, HttpServletResponse, HttpSession)

  • 객체 관리의 자동화 -> Reflection API

    • 동적 객체 생성, 동적 메서드 호출, 동적 변수 값 변경

  • Class 클래스 -> 각 구성 요인 Constructor 객체, Method 객체, Field 객체 ..

  • java.lang.Class

    • Constructor[] getConstructors() : public 범위의 생성자 메서드를 조회
    • Constructor[] getDeclaredConstructors() : 모든 범위의 생성자 메서드를 조회(private, default, protected, public)


프로젝트예제)

ㄴ PathVariable : 경로변수

ㄴ RequestParam : 쿼리스트링 값 혹은 바디데이터에서 일치하는 값이 있으면 주입 = 요청데이터의 이름, get도 되고 post도 됨
ㄴ RequestJoin : 데이터 클래스

ㄴ 여기 있는 데이터 이름과 동일한 요청데이터가 있다
-> 전부다 알아서 setter를 호출해주고 다 주입된다
-> 데이터클래스는 무조건 setter 와 getter가 있어야 함
-> HandlerAdapter쪽에서 setter를 데이터클래스 이름을 보고 동적으로 호출해주고 값을 넣어준다 자료형도 알아서 변환해줌

ㄴ 데이터를 출력해보려구 값을 넣어봄
ㄴ 따로 HttpServletRequest를 하지 않아도 다 출력될 것임

ㄴ 경로변수 = 바뀌는 데이터 = 이 데이터는 변수값으로 주입된다

ㄴ 유입됨
ㄴ PathVariable : 경로변수



그냥예제)

ㄴ 기본생성자 정의
ㄴ 매개변수가 있는 생성자 정의

Class Class<T>
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html

  • java.lang.Class

    • Constructor[] getConstructors() : public 범위의 생성자 메서드를 조회
    • Constructor[] getDeclaredConstructors() : 모든 범위의 생성자 메서드를 조회(private, default, protected, public)
  • Constructor[] getConstructors(), Constructor[] getDeclaredConstructors() 의 반환값 자료형
    = T newInstance(Object... initargs)의 자료형

ㄴ 생성자 목록이 나옴(단, 접근제어자가 public인 것만)

ㄴ 모든 생성자 목록이 나옴

ㄴ 클래스클래스통해 클래스 정보 가져옴
Constructor[] getDeclaredConstructors() : 해당 클래스의 모든 생성자 목록 출력

ㄴ 이 constructor안에는 동적으로 객체를 만들 수 있는 기능이 있음



예시) 동적객체생성

java.lang.reflect(reflect API)_Class Constructor<T>
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/reflect/Constructor.html

  • Class Constructor<T>

    • T newInstance(Object... initargs)
      : 객체를 통적으로 생성할 수 있는 메서드 = 직접 new를 하지 않아도 생성 가능
      : 매개변수가 있는 생성자는 전개연산자 부분에 넣으면 됨
  • Constructor[] getConstructors(), Constructor[] getDeclaredConstructors() 의 반환값 자료형
    = T newInstance(Object... initargs)의 자료형

  • T newInstance(Object... initargs) 를 쓰는 이유!

    • 투입되는 객체가 명확하게 뭔지 모를 때가 있음
    • 지금 아래 예제는 알고 있지만 무작위로 객체를 생성하게끔 할 때 사용

예시) 기본생성자 동적객체생성

T newInstance(Object... initargs) : 객체를 통적으로 생성할 수 있는 메서드 = 직접 new를 하지 않아도 생성 가능
ㄴ 매개변수가 있는 생성자는 전개연산자 부분에 넣으면 됨?

T new Instance(Object... initargs) 통해 기본생성자를 동적으로 객체 생성함
ㄴ 반환값이 object라 강제형변환


예시) 매개변수가 있는 생성자 동적객체생성

ㄴ 매개변수가 있는 생성자도 동적으로 객체 생성해줌


예시) 매개변수가 있는 생성자 동적객체생성(배열)

  • 투입되는 매개변수가 몇개인지, 타입은 무엇인지 등등 정보를 모를 때 사용

java.lang.reflect(reflect API)_Class Constructor<T>
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/reflect/Constructor.html

T new Instance(Object... initargs)

  • 생성자매개변수를 직접 나열하지 못하는 경우
  • ... : 가변적 ← object 배열을 넣어도 ㅇㅋㅇㅋ
  • 근데 배열은 공간이 한정적임
    -> 그래서 보통은 동적으로 유연하게 만들기 위해서 List형태로 만들고 toArray메서드 사용해서 배열로 바꿔서 투입
    -> List형태로는 투입안됨 배열로 바꿔줘여함 왜?

int getParameterCount()

  • 생성자 매개변수의 갯수

Class<?>[] getParameterTypes()

  • Parameter의 클래스클래스

Annotation[][] getParameterAnnotations()

  • 특정 파라미터마다 붙어있는 애노테이션

ㄴ 생성자 매개변수의 갯수


예시1) 생성자 매개변수가 뭔지알고 동적객체생성하기


예시2) 생성자 매개변수가 뭔지 모른다 가정하고 동적객체 생성하기

ㄴ 배열형태로 반환되니까 length사용 가능
ㄴ 순서대로 자료형도 알 수 있음

ㄴ 매개변수가 한개인지 두개인지 아애없는지 자료형은 무엇인지 알 수 없음
ㄴ Object 배열은 공간이 한정적임
ㄴ 그래서 보통은 동적으로 유연하게 만들기 위해서 List형태로 만들고 toArray메서드 사용해서 배열로 바꿔서 투입

profile
귤귤

0개의 댓글

관련 채용 정보