1. HTTP (HyperText Transfer Protocol) 이해
데이터를 주고 받는 양식 (protocol) 중하나요 (https 는 뒤에 s Security 가 추가된).
1.1 HTTP request
클라이언트에서 서버로 데이터를 요구하는 것 e.g method 는 GET 이고 path 는 index.html (홈페이지).
1.2 HTTP response
서버에서 클라로 데이터를 보내는것 e.g status 는 200 으로 , context-type 은 text/html (charset = UTG-8).
(둘다 개발자 도구에서 확인 할수 있다)
status code 첫번제 숫자는 상태코드의 분류 나머두 두개는 세부적인 정보.
첫자리 1 은 (100) 은 요청은 소신가 되었고 현제 정보를 받는 게 진행 되는 중 (웹브라우자랑 서버 연결 확인을 위해 사용)
첫자리 2 는 (200) http 요청이 성공적으로 처리 되었음을 나타냄.
첫자리 3 은 (300) 클라이언트가 추가적인 조치리 취해야 할때.(redirection 할때)
첫자리 4 는 (400) 클라이언트 에 오류가 있음을 나타냄. 잘못된 요청 || 인증 오류. (404 not fond 에러)
첫자리 5 는 (500) 서버에 오류가 있음을 나타냄. (서버 오류 || 서버 과부하).

1.3 Headr (추가 데이터, 메타 데이터)
브라우저가 어떤 페이지를 원하는지 (request) 받은 페이지를 찾았는지, 어떻게 형식으로 보낼지.
e.g : GET.naver.com HTTP/1.1
1.4 Payload (데이터, 실제 데이터)
서버가 응답을 보낼때 항상 Payload 를 보낼수 있음
클라 가 요청 할때토 Payload 를 보낼수 있음.
(그리고 get method 를 제외하곤 모두 payload 를 보낼수 있다, 는 게 HTTP 약속)
GET 은 HTTP 파일 body 가 존재 하지 않음.
2. Test Code.
버그(bug) 는 소프트 웨어가 예상하지 못한 결과를 내는것을 의미함.(scorse code 나 ,설계 오류)
이 버그들을 잡기위해 Test Code 함.
2.1 blackbox test
배포전에 사용자들, 베타테스터 들이 실행하고 버그를 찾아내는것 , (기능이 증가하면 테스트 범위도 증가함. 테스터 숫자가 늘어남 ,테스터 기량에 따라서 test 의 quality 가 다를수 있음)(QA 라는 직).
2.2 개발자 테스트
개발자가 본인이 작성한 코드를 테스트 코드를 작 하는것.
본인이 작성한 코드라 코드 이해도가 높을것이고. 테스트 자동화 할수 있음.
단점은 개 시간이 오래걸림, 테스트 코그를 유지/보수 하는 비용이 많이 듬.
2.3 Junit (unit test)
Java 를 사용할때 테스트 코드를 사용할수 있게 해주는것 (자동으로 만들어 주게 할수도 있음).
(Junit test 에서는 따로 글을 작성할 예정입니다).
3. Lombok 과 application.properties
인텔리제이 setting 에서 annotation processer 에 enable 해야함.
lombok 로 install/enable 해주셈.
lombok 으로 getter / setter 설정 가능.
@Setter
@Getter
@AllArgsConstructor // 모든 args 가 들어 있은 생성자 memo (String username, String contents);
@NoArgsConstructor // 기본 생성자 memo()
@RequiredArgsConstructor // final 이 달린 필드를 가진는 생성자
application.properties
main -> resources -> application.properties
spring 과 관련되 자동으로 설정되어 있던 파일 을 수정할수 있음.
e.g apachi tomcat port 가 8080 이 기본인데 그걸 바꿀수 있음.
server.port=3001
(비슷한 방식으론 spring application yaml 로도 할수 있음). // 추가 연구 예정.
4. Spring 연습 하기 위해 mySQL 설치 JDBC https://dev.mysql.com/downloads/mysql/
5.Spring mvc ( Java GUI 프로 젝트 할때도 쓰는 개념. ) 디자인 패턴.
model (모델) - 데이터랑 비즈니스 로직 을 담당 합니다.
view (뷰) - 인터페이스 담당 - gui swing 같이.
controller ( 컨트롤러) - model 과 view 의 상호 작용을 조정 하고 구현.
5.1 Spring 에서 의 mvc
Front controller 로 설계 되어 있다. - mvc 디자인 패턴을 사용하여 http 요청을 효율적으로 처리.
5.2 DispatcherSeviet
Serviet(서블릿) 은 java 를 사용 하여 웹 페이지을 동적으로 생성 하는 서버측 프로그램 혹은 그 사양을 말합니다.

동적인 컨텐츠 사용시 WAS(Tomcat) 을 사용한다고 말했습니다.
Tomcat 안 에 (Web Container)Serviet 이 있다고 보시면 됩니다.
1. request 를 받았을때 HttpServietRequest 랑 HttpServietRestponse 객체(Object) 가 생성됩니다.
약속된 http 의 구격을 마추면서 쉽게 http 에 담긴 데이터 를 사용하기 위한 객체.
(http 는 약속된 구조 입니다, 그래서 어떤 브라우저로 와도 모두가 동일합니)
HttpServietRequest : 클라 에게 값을 받아올 수가 있는데 만약 회원 정보를 컨트롤러로 보냈을 때 HttpServletRequest 객체 안에 모든 데이터들이 들어가게 됩니다.
HttpServietRestponse : 응답을 하기 위한 Serviet 객체를 미리 만들어 둡니다.
이것은 Http 응답 메시지 생성, 응답 코드 (100 ~ 500) 같은것, body 생성 그리고 편의 기능 제공 (Content-type, Cookie, Redirect).
2. Serviet 분석
원래는 xml 파일에 정보를 다 성정 했습니다 (원래 Spring 에서는) 현제 Spring boot 에서는 간편하게 Annotation 기반으로 설정이 가능하게 되었습니다.
API 요청이 /API/hello 면 그거랑 매칭 이 되는 Serviet 을 정보가 Web.xml 에 담겨 있는데 그걸 매칭이 있는 지 분석 합니다.
3. 찾은 Serviet 실행
matching 된 Serviet 을 실행.
4. 해당 Serviet 에서 Service() 메소드 호출,
그다음에 http 요청이 어떤 메소드 방식인지 확인 합니다 (POST, GET , PUT ....).
Get 이면 doGet() 메소드를 호출.
Post 면 doPost() 메소드를 호출.
5. 그 호출한 method 들을 그대로 반환 하거나 동작 페이지를 생성뒤에 HttpServietRestponse 에 담아서 클라이언트에 반환 하게 됩니다.
DispatcherServiet 은 Dispatcher(전달하는) Serviet.
API 가 1000 개 있다고 가정합니다.
그럼 그 API 에 매칭이 되는 Serviet 을 다 구현 해야 합니다. 어떤 http method 인지도 확인 해야 하고 방식에 맞는 객체를 만들어서 또 보내줘야 합니다.
그래서 이러한 불편함을 없에기 위해 Spring 에서는 DispatcherServiet 으로 Front controller 방식으로 이 모든 API 들을
효율적으로 처리 할수 있게 됩니다.

1. Client 에서 온 HTTP Resquest 에 DispatcherServlet 이 객체가 요청 분석을함.
2. DispatcherServlet 객체는 분석한 데이터를 토대로 Handler mapping 을 통하여 Controller 를 찾아 request 를 전달해줍니다.
GET /api/hello → HelloController 의 hello()
GET /user/login → UserController 의 login()
GET /user/signup → UserController 의 signup()
POST /user/signup → UserController 의 registerUser()
3. Handler mapping 에는 API path 랑 Controller method 가 매칭 되어 있음.
@RestController
public class HelloController {
@GetMapping("/api/hello")
public String hello() {
return "Hello World!";
}
}
API path 즉, URL 을 Controller에 작성하는 방법은 @Controller 달려있는 클래스를 생성한 뒤
@GetMapping 처럼 요청한 HTTP Method 와 매칭 하는 Annotation 을 추가한 Method 를 구현합니다.
URL은 @GetMapping("/api/hello") 이처럼 해당 애너테이션의 속성값으로 전달해주면 됩니다.
그러므로 우가가 직법 Serviet 을 만들지 않아도 DispatcherServiet 이 알아서 해줌.
4. Controller → DispathcerServlet
해당 Controller 는 요청에 따라서 처리를 완료 한뒤에 결과를 mode 과 view 로 전달.
5. DispatcherServlet → Client
view Resolver 통해 View 에 Model 정용하여 View 를 Client 에게 응답으로 전달합니다.
6.Controller 이해
Controller의 장점
만약 Spring MVC에 Front Controller 패턴이 적용되어있지 않았다면 어땠을까요?
4개의 API를 처리하기 위해 무려 3개의 클래스를 만들어야했을 겁니다.
다행히 Spring MVC는 효율적인 API 처리를 위해 Front Controller 패턴을 만들어냈습니다.
이제는 API 마다 파일을 만들 필요 없습니다.
- 보통 하나의 Contoller 에 모든 API를 넣지는 않습니다.
- 유사한 성격의 API 를 하나의 Controller 로 관리합니다
메서드 이름도 내 마음대로 설정 가능합니다. (단, 클래스 내의 중복메서드명 불가)
보통 하나에 컨트롤러 에 모든 api 를 넣지는 않지만 가능 하긴함.(협업&코드분석 을 수월하기 위해).
유사한 api 들을 같은 컨트롤러에 넣는다고 보면됨.
로그인 관련 api 를 모아둔 컨트롤러 :
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/login")
public String login() {
// ...
}
@GetMapping("/logout")
public String logout() {
// ...
}
@GetMapping("/signup")
public String signup() {
// ...
}
@PostMapping("/signup")
public String registerUser(SignupRequestDto requestDto) {
// ...
}
}
예제
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@GetMapping("/api/hello")
@ResponseBody
public String hello(){
return "hellomyworld";
}
@GetMapping("/api/get")
@ResponseBody
public String get(){
return "Get 방식입니다";
}
@PostMapping("/api/post")
@ResponseBody
public String p(){
return "post 방식입니다";
}
@DeleteMapping("/api/delete")
@ResponseBody
public String d(){
return "delete method 사용";
}
}
@ResponseBody : 일단은 return 을 String 타입으로 했기 때문에 필요함.
만약에 ResponseBody 없을시에는 string 에 적혀 있는 이름의 html 파일을 반환함
@GetMapping : get 방식으로 request 가 왔을때 데이터를 보내줄때 사용
@PostMapping : post 방식으로 request 가 왔을때 데이터를 보내줄때 사용
@PutMapping : put 방식으로 request 가 왔을때 데이터를 보내줄때 사용
@DeleteMapping : delete 방식으로 request 가 왔을때 데이터를 보내줄때 사용
API 경로(url 주소) 가 중복 할수 있지만 method 방식 은 중복 핫우 없음니다.
개발자들은 중복 코드 싫어 합니다.
@ResquestMapping ("/api"): 하면 코드 안에 있는 api 를 자동으로 적용됨.
@Controller
@RequestMapping("/api")
public class HelloController {
@GetMapping("hello")
@ResponseBody
public String hello(){
return "hellomyworld";
}
http://localhost:8080/api/hello 로 됌.
7. 정적 페이지 동적 페이지 반환
정적
1. main -> resources -> static 에 new html 파일 만들기
2. 컨트롤러 만들기(?)
@Controller
public class htmlcontroller {
@GetMapping("/static-hello")
public String H(){
return "hello.html";
}
}
당장은 http://localhost:8080/hello.html 로 볼수 있음
http://localhost:8080/static-hello 하면 오류가 남.
(static (정적) 인 컨텐츠 이기 때문에 Controller 를 거쳐서 반환할 필요가 x)
3. build.grande 에 dependencies 에 있는 타임리프엔진 (thymeleaf engine)
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
library 는 동적인 컨텐츠를 resources/templates 안 에서 찾게 고정을 해놨음.
그래서 이것을 주석 처리하면
http://localhost:8080/static-hello 로도 작동합니다.
)
4. 3번 방식이 아니라 다르게 하는 방법은 redirect
@GetMapping("/html_redirect")
public String Hr(){
return "redirect:/hello.html";
}
한번 돌아서 접근 하게함.
(함수 쓰듯이 편안하게 한번 수정으로 많이 것드리 수정)
5. hello.html 을 template 안에 넣어서 사용할시.
@GetMapping("/html_templates")
public String Ht(){
return "hello";
}
(template 폴더 안에 있는거 에 .html 를 자도으로 붙혀서 가져옴)
동적
값하나 만들고
private static long visitcount=0;
@GetMapping("/html/dinamic")
public String Hd(Model model){
visitcount ++;
model.addAttribute("visits",visitcount);
return "hello-visit";
}
template 안에 있는 html 에 추
<div>
(방문자 수: <span th:text="${visits}"></span>)
</div>
'Spring' 카테고리의 다른 글
| Spring 기초 6 (영속성) (EntityManager) ( Persistence 기능) (변경 감지(Dirty Checking)) (0) | 2024.01.20 |
|---|---|
| Spring 기초 5 (Entity) (0) | 2024.01.20 |
| Spring 기초 4 (MVC) (JPA) (BEAN) (@Componet @Autowired) (Hibernate) (0) | 2024.01.20 |
| Spring 기초3 (데이터 받는 method) (Json 변환 String&Object) (@RequestParam @RequestBody) (HTTP 를 객체로) (0) | 2024.01.19 |
| Spring 기초1 (Grandle) (서버란) (WAS) (0) | 2024.01.17 |