목차
1. 웹을 개발하는 3가지 방법?
2. MVC 패턴의 5가지 규칙
3. @Controller와 @RestController의 차이
4. Long과 AtomicLong은 어떠한 차이가 있을까?
5. "templates"은 경로를 표시하지 않아도 되는 이유?
6. 추가적인 내용들
1. 웹을 개발하는 3가지 방법?
웹을 개발하는 3가지 방법은 다음과 같다.
(1) 정적 컨텐츠 : HTML 파일, 즉 정적 파일이 있는 그대로 브라우저에 반환한다. (hello-static.html 관련 컨트롤러가 없으니 정적 파일을 찾아보는 것이다!)
(2) MVC와 템플릿 엔진 (가장 많이 사용한다)
- MVC : 유지 보수가 뛰어난 코드 구성 방식이다.
- View : 사용자에게 직접 보여지는 부분을 담당한다.
- Controller : 사용자의 요청을 처리하고 모델과 뷰의 중개자 역할을 한다.
- Model : 데이터를 주고 받는 공간이다.
클라이언트가 /hello-mvc에 접근 시 컨트롤러가 viewResolver에게 요청에 맞는 template을 응답한다.
(3) API : 데이터 구조 포맷으로 클라이언트가 요청한 데이터를 응답한다.
- Responsebody를 통해 응답하기
- http 응답부분의 body에 직접 값을 넣어주겠다는 뜻이다. View를 사용하지 않는 무식한 방법이다...!
- 만약, Responebody가 객체 부분을 반환한다면 json 방식으로 데이터화시켜서 응답 body에 넣는다.
- viewResolver 대신에 HttpMessageConverter가 동작한다.
2. MVC 패턴의 5가지 규칙
(1) Model은 Controller와 View에 의존하면 안된다. (Model 안에 Controller와 View의 코드가 있으면 안된다.)
(2) View는 Model에만 의존해야하고 Controller에 의존하면 안된다.
(3) View가 Model로부터 데이터를 받을 때, 사용자에 따라서 각각 다르게 보여줘야하는 데이터만 받아야한다. (예를 들어 배민 앱에서 주문하기 버튼은 기본 뷰에 있어야하고, 주소는 사용자마다 다르기에 Model로부터 받아야함.)
(4) View가 모델로부터 데이터를 받을 때 반드시 컨트롤러를 통해 받아야한다.
(5) Controller는 Model과 View에 의존해도 된다.
3. @Controller와 @RestController의 차이
@controller 와 @RestController는 주요 기능에 있어서 큰 차이점이 있다. @controller의 주요 기능은 View를 랜더링하는 ViewResolver의 설정에 맞게 View를 반환하는 것이다.(이때, @controller는 Model 객체를 만들어 데이터를 담아 View를 반환하기도 한다.) 반면, @RestContorller의 주요 기능은 Json 형태로 객체 데이터를 반환하는 것이다. 추가적으로, @controller에 @responsebody를 추가적으로 어노테이션하면 @RestController처럼 Json 형태로 데이터를 반환할 수 있다.
4. Long과 AtomicLong은 어떠한 차이가 있을까?
결론부터 말하자면 AtomicLong은 int, Long과 달리 thread-safe하게 구현되어 멀티쓰레드에서 synchronized보다 적은 비용으로 동시성을 보장할 수 있다.
예를 들어 자료형이 Long인 변수값을 증가시키는 계산을 한다면 다음과 같은 3가지 연산이 발생하게 된다. 변수의 초기 값을 얻고, 증가시키고, 증가시킨 값을 업데이트한다. 여러 개의 스레드가 하나의 변수에 대해 연산하게 된다면 연산 과정이 꼬여 정보의 손실이 발생하게 될 수 있다. 이러한 문제점을 동시성 문제라고 한다. 실제로 스레드들은 프로세스들과 달리 코드 영역과 데이터 영역을 공유하기에 스레드 하나가 잘못된 연산이나 버그 등으로 비정상 종료를 하게 된다면 같은 프로세스에 속한 다른 스레드들까지 강제로 종료된다. 이때, synchronized 키워드를 통해 여러 스레드가 한 가지 변수값에 대해 연산할 때 lock을 걸어 한 번에 한 스레드만이 연산 과정을 진행하여 동시성 문제를 해결할 수 있다. 그러나 한 번에 한 스레만이 연산 과정을 진행하기에 다른 스레드들은 기다리게 되는, 성능적인 문제점이 발생하게 된다.
앞선 문제들을 CAS 알고리즘을 통해 해결하였다. CAS 알고리즘 또한 synchronized처럼 한 스레드가 다른 스레드들과의 경합에서 이기고 변수 값을 업데이트한다. 그러나 synchronized와 달리 한 스레드가 변수 값을 업데이트하는 동안 다른 스레드들은 추가로 다른 작업을 수행할 수 있다.
5. "templates"은 경로를 표시하지 않아도 되는 이유?
왜냐하면 templates 디렉토리는 일반적으로 Spring 프레임워크에서 View를 저장하는 곳이기에 Controller 작동시 Spring 내부적으로 이 디렉토리에 있는 파일들을 읽어들이기 때문이다.
6. 추가적인 내용들
- Spring MVC가 동작하는 구조
- 어노테이션이란? 주석과 같은 의미를 가진다. 주석은 사람에게 정보를 제공하는 것이라면, 어노테이션은 특정 코드를 사용하는 프로그램에게 정보를 전달한다.
- 매핑이란? 어떤 값이 다른 값에 대응하도록 하는 것. +RequestMapping : url 요청이 왔을 떄 어떤 컨트롤러가 호출되어야할 지 정하는 것이 바로 적절한 컨트롤러를 매핑하는 것.
- 쿼리란? 직역하자만 질문, 문의하다는 뜻으로 질문에 대한 답을 요청하는 것이다. 따라서 쿼리란 데이터베이스에 사용자가 요청한 특정 데이터를 보여달라는 요청을 야기한다. (따라서 쿼리문 작성 == DB에서 원하는 데이터를 가져오라는 코드를 작성)
- 의존성 thymeleaf의 쓰임? thymeleaf를 통해 다른 템플릿 엔진과 달리 확장자 명을 html파일 그대로 사용할 수 있다.
- dto의 쓰임? 계층 간 데이터 교환을 위해 사용되는 객체로 속성 노출과 상태 변경의 안정성을 유지해준다.
'Backend > Spring' 카테고리의 다른 글
[세차새차] 양방향 매핑 지양과 순환 참조의 위험성 - 회원 관리 기능 개발 (2) | 2024.08.31 |
---|---|
[Kakao Tech Campus Step2] 2주차 회고 (0) | 2024.07.07 |
[Kakao Tech Campus Step2] 1주차 회고 (1) | 2024.06.30 |
[Spring Core] 초록 스터디 Step3 회고 (0) | 2024.05.03 |
[Spring MVC] 초록 스터디 Step2 회고 (1) | 2024.04.22 |