| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- crud
- Sts
- AWS
- MegabyteSchool
- tomcat
- spring boot
- 클래스 class
- View
- #javaStudy
- 게시판 리뷰 만들기
- 메가바이트스쿨
- Entity
- 클래스 상속
- 패스트캠퍼스
- Algorism study
- 국비지원교육
- 내일배움카드
- #패스트캠퍼스 #국비지원교육 #메가바이트스쿨 #MegabyteSchool #개발자취업부트캠프 #내일배움카드
- MVC 패턴
- group study
- array
- 게시판 만들기
- MVC
- side project
- GIT
- Interface
- github
- Spring
- 개발자취업부트캠프
- Java
- Today
- Total
tuter77
2023.01.06 TIL 본문
<목차>
<공부계획표>
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 에 들어가면 확인할 수 있다.)
그림으로 보면 아래와 같다.

- 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 |