💻문제점
- maven으로 서블릿 프로젝트를 잘 못 생성해서 build.gradle 파일에 jspl dependencies를 추가해야 하는데 추가할 수 없는 상황이 발생했다...
📃시도
우선 프로젝트의 터미널을 git bash로 설정하고, 로컬에 gradle을 깐다.
git bash에 gradle init --type pom 입력하면 gradle 관련 파일들이 생성된다. 우측에 gradle 메뉴도 생기는 것을 확인했다.
mvnw, mvnw.cmd, pom.xml 파일을 삭제하고 프로젝트를 재실행해봤는데, 실행이 되지 않았다.
🔍해결
가장 간단한 방법은 gradle로 다시 프로젝트를 생성하는 것이다...! 프로젝트 안에 파일이 많은 것도 아니었고, 스터디 시간도 많이 남지 않았어서 다시 프로젝트를 만드는 것을 택했다.
🤦♀️의문점
- PRG를 위해 doPost()에서 sendRedirect()를 하는 것은 알겠다. 그런데, doGet()에서 sendRedirect()를 사용하면 안되는걸까? 왜 RequestDispatcher를 사용하지?
- RequestDispatcher 왜 forward를 많이 쓰지? include는? 뭐가 다른데?
- 아니 어떻게 enum 타입 클래스로 싱글톤 패턴을 구현할 수 있어? 내가 그 동안 썼던 방식은 구닥다리 였구나...
💡알게 된 점
JSP와 서블릿
JSP: HTML 코드를 그대로 이용하고 필요할 때 약간의 자바 코드를 넣음
→ JSP 파일도 서블릿 코드로 변환되어 컴파일되고 실행된다
서블릿 코드: 자바 코드를 이용해서 HTML 문자열을 만들어내는 방식
서블릿/JSP 동작
브라우저에서 요청이 들어오면 요청과 일치하는 서블릿에 전달 → 서블릿 내부에서 응답에 필요한 데이터들 준비 → JSP로 전달 → JSP에서 EL을 통해 결과 데이터 생성 → 생성된 화면은 톰캣을 통해 브라우저로 전달
RequestDispatcher vs. sendRedirect
RequestDispatcher는 브라우저에서 요청이 오면 요청과 일치하는 서블릿이 jsp 뷰를 톰캣을 통해 클라이언트에게 전달한다. 간단히 도식화를 하자면 다음과 같다.
sendRedirect는 브라우저에서 요청이 오면 서버가 응답에 Location 헤더를 설정하여 클라이언트에게 보내고, 클라이언트가 해당 경로를 서버에 요청한다. Location은 Http 메시지의 헤더 부분에 작성하는 것인데, Location 헤더를 적어 보내면 클라이언트는 해당 url로 이동(Redirect)하게 된다.
2번의 Http 트랜잭션이 발생하므로 PRG 패턴을 사용하는게 아니면 RequestDispatcher를 사용하는게 맞는 것 같다.
RequestDispatcher include() vs. forward()
include()
A페이지 → 흐름 제어를 B페이지에 넘김 → B페이지에서 처리가 완료되면 해당 결과를 A페이지에 넘겨주고, 제어권도 넘겨줌 → A페이지에서 B페이지 결과를 포함하여 클라이언트에게 응답
현재 페이지(A)에서 다른 페이지(B)를 호출!
얘는 한 번 직접 테스트해서 확인해보는 것도....
forward()
아예 A페이지 → B 페이지로 완전히 이동
응답 메시지에 적은 내용을 모두 무시한다. 실제 개발에서는 거의 forward()만 사용한다고 한다.
enum타입 싱글톤 패턴
내가 쓰던 싱글톤 패턴... 코틀린을 사용했을 때는 object 키워드로 쉽게 싱글톤 패턴을 구현했어서, 다음 코드처럼 쓰는게 불편했는데 enum타입으로 싱글톤 패턴을 구현할 수 있었다...
public class Constant {
private static Constant instance = new Constant();
private Constant() {
}
public static Constant getInstance() {
return instance;
}
/* ... */
}
다음과 같이 매우 간단하게 구현할 수 있다. enum class로 구현하면 외부에서 인스턴스화 할 수 없다.
리플렉션 공격을 막아준다는데 리플렉션 공격이 뭔지 알아봐야겠다.
public enum Constant {
INSTANCE;
/* ... */
}
참고자료
'TIL' 카테고리의 다른 글
[TIL - 20230410] DAO, DTO, VO (0) | 2023.04.10 |
---|---|
[WIL - 20230409] (0) | 2023.04.09 |
[TIL - 20230403] (0) | 2023.04.04 |
[TIL - 20230324] (0) | 2023.03.24 |
[TIL - 20230323] (0) | 2023.03.24 |