tuter77

2023.01.06 TIL 본문

TIL

2023.01.06 TIL

tuter77 2023. 1. 6. 18:46

<목차>

  1. <공부계획표>
  2. Java
  3. Spring
  4. Group Study

<공부계획표>

13:00 ~ 14:00 그룹 스터디 

          공용데이터 활용하여 CRUD 구현한것 피드백

14:00 ~ 18:00 (3시간) 온라인강의 시청.

           14:00 ~ 15:00 Spring 강의 시청

           15:00 ~ 16:00 Spring 강의 시청

           17:00 ~ 18:00 java 강의 시청

18:00 ~ 19:00 식사시간

19:00 ~ 22:00 java 실시간 강의

           19:00 ~ 20:00 

           20:00 ~ 21:00 

           21:00 ~ 22:00 

22:00 ~ 23:00 블로그 작성 및 프로그래머스 문제 풀기.


<Java>

● 다운캐스팅과 instaceof

 

▷DownCasting

- 업캐스팅 된 클래스를 다시 원래의 타입으로 형 변환

- 하위 클래스로의 형 변환은 명시적으로 해야한다.

 

예시) Customer vc  =  new VIPCustomer(); //묵시적

VIPCustomer vCustomer = (VIPCustomer)vc; //명시적

 

 instanceof 키워드

해당 instance의 타입을 확인해 인스턴의 형이 맞으면 true, 아니면 false를 반환한다.

 

예시) 

		
        Customer customerE = new GoldCustomer(10030, "Edward");
       
        if(customerE instanceof GoldCustomer) {
			GoldCustomer vc = (GoldCustomer)customerE;
			System.out.println(customerE.showCustomerInfo());
		}

위의 예시에서 보면 instanceof라는 키워드를 사용하여 customerE가 원래 GoldCustomer 인지를 확인한다.

 

다른 예시를 보면 아래와 같다.

//arraylist를 매개변수로 주어서 다운캐스팅하는 것 구현.
	public void testDownCasting(ArrayList<Animal> list) {
		for(int i=0; i<list.size(); i++) {
			
			Animal animal = list.get(i);
			
			if(animal instanceof Human) { //human 다운캐스팅
				/*
				 * human 변수가 animal 타입에서 Human타입으로
				 * 다운캐스팅되어 하위클래스 고유 메서드를 사용할 수 있음.
				 */
				Human human = (Human)animal; 
				human.readBook();
			}
			else if(animal instanceof Tiger) {
				
				Tiger tiger = (Tiger)animal;
				tiger.hunting();
			}
			else if(animal instanceof Eagle) {
				
				Eagle eagle = (Eagle)animal;
				eagle.flying();
			}
			else {
				System.out.println("unsupported type");
			}
		}
	}

 

기존의 animal 예제에서 각 하위클래스 인스턴스들이 업캐스팅 되어있었는데(상위클래스 animal로) instanceof 키워드를 활용하여 다운캐스팅을 명시적으로 해놓은 코드이다.

인스턴스의 타입이 변했기 때문에 각 하위 클래스의 고유 메서드도 잘 사용되는것을 확인할 수 있다.

 


<Spring>

 

● 클라이언트와 서버

 

▷복습

브라우저(url)를 이용해서 서버에 요청을 하면 톰캣이 객체를 생성해서 정보를 저장한다.

나눠서 객체에 담긴 정보들을 메서드의 매개변수로 제공한다.(ex. @RequestMapping -> main())

메서드의 매개변수들은 원하는대로 지정할 수 있고, 이는 스프링이 자동으로 처리를 해준다.(HttpServletRequest)

 

- HttpServletRequest의 메서드는 url의 형태로 볼때

getRequestURL() 안에 getSchema(), getServerName(), getServerPort(), getRequestURL[getContextPath(), getServletPath()]순으로 나열되고, ? 이후로는 추가적인 정보들이 나열된다. 이는 getQueryString() 으로 호출된다.

 

예시로보면 http(getSchema())://52.78.79.190(getServerName()):8080(getServerPort())/ch2(getContextPath())/requestinfo(getServletPath())?year=2021&month=10&day=1(getQueryString())

와 같이 나열된다.

 

getQueryString()은 getParameter("name") 를 이용한다.

이외에도 getParameterMap()은 위의 쿼리 스트링을 

key value
"year" "2021"
"month" "10"
"day" "1"

의 형태로 반환해준다.

 

혹시 쿼리 스트링의 name이 모두 같을 경우, getParameterValues("name")을 이용해서 배열로 받을 수 있다.

 

▷ 클라이언트와 서버

 

- 클라이언트 : 서비스를 요청하는 애플리케이션 또는 컴퓨터

- 서버 : 서비스를 제공하는 애플리케이션 또는 컴퓨터

 

- 서버의 종류 : 어떤 서비스를 제공하느냐에 따라 달라진다.

email server  > 이메일 제공.

file server > 파일 제공.

web server > web제공 > 브라우저를 통해 받을 수 있는 모든 서비스를 제공하는 것.

 

예를 들어 한 대의 pc에 위 3가지 서버가 존재할 경우, ip주소만 가지고는 요청을 어느 서버에 요청하는지 알 수 가없다.

때문에 port 번호를 써서 서버를 지정한다.

(웹서버는 기본이 80인데 생략이 가능하다 > 톰캣은 8080이라 생략불가)

 

이 요청을 처리하려면 서버가 각 포트와 연결(binding)되어 있어야 한다.

한 port에는 한 서버만 연결될 수있다. 

서버가 실행되어있어야 요청을 받을 수 있는데, 이 포트에 바인딩되어 요청을 기다리는 상태를  Litening하고 있다라고 말한다.

port 0 ~ 1023 까지는 예약되어있어 사용할 수 없다.

그 위의 약 6만개 포트는 새로 바인딩할 수 있다.

 

WAS (Web Application Server)

 

웹 애플리케이션을 서비스하는 서버를 일컫는다.

즉, 프로그램을 서버에 설치해놓고, 클라이언트가 프로그램을 사용할 수 있게 해주는것이다.

프로그램을 클라이언트에 설치할 수도 있지만 서버에 설치해놓고 제공하는 것이다.

때문에 원격 프로그램을 호출하는 것이다.

이 덕에 클라이언트는 실행 결과만 받을 수 있다.

 

-update 용이성.

과거에는 프로그램을 각 컴퓨터에 설치해서 사용했는데, 이는 update가 문제가 된다.

때문에 WAS를 통해 업데이트 문제를 해결하게 되었다.

 

▷ Tomcat의 내부구조

- 브라우저의 요청이 8080 포트를 통해 서버에 전달된다.

이 요청은 Thread Pool에 미리 생성된 Thread 중 하나가 요청을 처리한다.

 

톰캣 서버안의 서비스가 있다.

 

이 서비스 안엔 Connector가 있는데, http.1, http2, ajp라는 Protocol을 갖고 있다.요청을 받았을때 어떤 프로토콜의 종류를 요청했느냐에 따라 커넥터의 종류도 달라진다.

 

해당 커넥터는 Engine(Catalina)로 요청을 전달하는데, 이 안의 n개(일반적으로 1개)의 Host들 중 하나에 전달한다.

 

Host 안에는 1개 이상의 n개의 Context가 있는데, 이 Context는 하나의 Web App(프로그램)이다. 

(앞서 실습한 예제의 경우로는 ch2로 볼 수 있다. 일반적으로 스프링 프로젝트들이다.)

 

해당 컨텍스트 안에는 여러개의 Servlet이 있다.

Servlet은 작은 서버 프로그램이라는 뜻으로, 서버에서 실행되는 프로그램들을 일컫는다.

Controller와 거의 같은 개념이다.

 

이 servlet이 작업을 수행하고 그 결과를 클라이언트에 전달하게 된다.

(* 위 내용은 tomcat 사이트의  tomcat 9.0 doc/architecture/overview.html 에 들어가면 확인할 수 있다.)

 

그림으로 보면 아래와 같다.

https://sowon-dev.github.io/2022/03/07/220307Server-tomcat/

 

 

 - STS에서 

 

좌측의 동그라미가 찍힌 번호를 우클릭하면 해당 라인을 ToggleBreakPoint로 지정할 수 있다. 

ToggleBreakPoint는 디버깅을 할 경우에 해당 라인에서 작업을 중단하는 위치를 찍는 것을 말한다.

이 ToggleBreakPoint를 지정하고 Debug on Server를 실행하면 아래와 같은 디버깅 화면이 출력된다. 

 

아래에서부터 stack이 쌓이는데,  run되면 그 위에 thread pool이 보인다.

thread pool 안의 여러 thread 중 하나가 해당 작업을 처리하고 이어 http11프로세서가 받아 전달한다.

connector > engine > Host > Context로 이동한 것을 볼수있다.

이 후 Filter를 통해 Servlet 전(pre)처리를 하고, 이후 Servlet이 요청을 받는다. 

그리고 그 요청은 Twodice라는 Controller로 전달되어 main()메서드를 호출한다.

 

아래에 보면 http 1.1 프로세서가 Request 와 Response 객체를 생성한 것도 볼 수 있는데, Socket 으로 객체를 생성하여 각  Request 와 Response 객체에 담아서 전달한다.

 

 


<Group Study>

● 구현한 CRUD

 

▷ 피드백

이전의 블로그 게시글에 올려놓은 코드들을 팀장님이 피드백 해주셨는데, 일단 독자적으로 코드를 쓴것이 아니라 실망하신 눈치였다.

능력부족이 체감되었지만, 그래도 각 기능들이 swagger를 통해 정상작동하여서 나름은 뿌듯했었다.(계속하다보면 나만의 코드도 쓸수있지않을까..)어쨌든 궁금했던, 어노테이션과 RequestDTO Body의 연관성에 대해선 원래는 크게 연관이 없다고 하셨다.다만 DTO 파일 내에선 어노테이션 중 @SETTER가 기존엔 파라미터 바디로 바꾸어주는 역할을 해서 해당 어노테이션을 제거하면 작동을 하지 않아야한다는데, 왜 그런지는 멘토님께 문의하기로 했다.

다만, 요청으로 오는 파라미터는 json(네트워크 상 주고받는 경량의 데이터 형식) objectMapper로 파싱(데이터를 뽑아내서 배열 등의 형태로 저장하는 과정) 되고, form 태그로 들어온 데이터가 Setter 어노테이션으로 들어간다고 한다고 추가적으로 설명해 주셨는데 잘 이해가가지않아 찾아봤다.

 

- json의 형태

 

요청들은 위와 같은 형태로 서버에 전달된다는데, 이 형식그대로라면 데이터를 사용할 수 없어서 사용할 수 있게끔 변경해주는게 parsing이라는 것 같다.

또한 이렇게 parsing된 데이터들이 setter라는 어노테이션을 통해 코드에 기재한 매개변수로 제공되어 각 기능들에서 사용할 수 있게 해준다는 것.

얼추 의미는 사용할 수 있게 가공했다는 정도는 알겠다.

다만, 아까 말한것처럼 어떻게 @setter가 없이 작동되는지는 해결하지 못했다.

 

 

▷ 다음 과제

댓글기능을 구현하려고 했지만, 데이터가 헬스장의 정보여서 리뷰로 엔티티 이름만 바꾸어 구현하기로 했다.규칙은 Review 엔티티와 healthInfo 엔티티를 양방향 관계로 설정하고, 내용으로는 id와 컨텐츠만 넣는것이다.원래는 각 리뷰의 CRUD역시 구현해야하나 나를 포함한 조원들이 아직 CRUD를 독자적으로 만들어보지 않아 다음으로 미루게 되었다.

'TIL' 카테고리의 다른 글

2023.01.10 TIL  (0) 2023.01.10
2023.01.09 TIL  (0) 2023.01.09
2023.01.05 TIL  (0) 2023.01.05
2023.01.04 TIL  (0) 2023.01.04
2023.01.03 TIL  (2) 2023.01.03