코딩 공부를 하다보면 '왜 이것을 사용할까?', '이 메소드는 어떤 방식으로 작동하는 것일까?'와 같은 질문들을 자주 하게 된다. 이러한 궁금증을 해결하기 위해 매주 스스로에게 했던 질문들을 정리하고 해소하는 시간을 가지고자 한다.
[ 1 ] EL의 작동 원리
처음 EL을 접했을 때 굉장히 신기했다. 멤버 변수를 private로 설정하고, getter/setter를 둔 객체에 멤버 변수가 마치 public인 것처럼 접근할 수 있었기 때문이다. (EL의 표현식 자체가 신기했다)
검색 결과 "EL은 JavaBean의 값을 JSP의 코드블록 <% %>이나 액션 태그 <jsp:useBean>을 사용하는 것보다 쉽고 간결하게 꺼낼 수 있는 기술"임을 알 수 있었고, 자연스럽게 JavaBean에 대해서도 공부할 수 있었다.
JavaBean이란 Java로 작성된 컴포넌트들, 일반적인 Java class를 의미하는데, '설계 규약'이 있다.
- 멤버 변수마다 별도의 getter/setter가 있어야 한다.
- get 메소드는 매개변수가 존재하지 않아야 한다.
- set 메소드는 반드시 하나 이상의 매개변수가 존재해야 한다.
- 멤버 변수의 접근제어자는 private이고, 각 getter/setter의 접근제어자는 public이어야 한다.
JavaBean의 설계 규약을 보니 EL의 정의와 역할을 더 잘 이해할 수 있었다.
JSP - EL 표현식 문법과 사용 방법
JSP - EL 표현식 문법과 사용 방법 EL(Expression Language)은 자바 빈의 프로퍼티, 값을 JSP의 표현식 이나 액션 태그 를 사용하는것 보다 쉽고 간결하게 꺼낼수 있게 하는 기술이다. 또한 static 메소드를
atoz-develop.tistory.com
https://choitaetae.tistory.com/96
[JSP] 자바빈(JavaBean)이란?
자바빈(JavaBean) JSP에서 객체를 가져오기 위한 기법으로 데이터 전달 오브젝트 파일 DTO(Data Transfer Object)라고도 한다. 자바로 작성된 컴포넌트들 즉, 클래스(Class)를 일반적으로 말한다. JSP 프로그
choitaetae.tistory.com
[ 2 ] Servlet forward 시 url은 변하지 않는 것인가? - forward 시 url은 변하지 않는다!
Servlet에는 페이지를 이동할 수 있는 방법으로 Redirect와 Forward가 있다.
① Redirect
Redirect는 이전 페이지에서 다음 페이지로 바로 넘어가는 것처럼 보이지만, 이전 페이지에서 redirect 요청을 받은 url을 클라이언트에게 전달하고, 클라이언트가 전달받은 새로운 url을 요청하면 다음 페이지가 response 되는 방식이다.
즉, "클라이언트 → 웹 서버(redirect - 다음 페이지 url을 reponse) → 클라이언트(다음 페이지 url을 request) → 웹 서버" 의 과정을 거친다.
② Forward
Forward는 Redirect와 달리 클라이언트의 한 번의 요청만으로 이전 페이지에서 다음 페이지로 바로 넘어간다. 클라이언트가 다음 페이지의 url을 다시 요청하도록 하지 않고, 서버에서 페이지를 바꿔서 반환해 주기 때문이다.
즉, "클라이언트 → 웹 서버(다음 페이지를 forward) → 웹 서버(다음 페이지 반환) → 클라이언트" 의 과정을 거친다.
Forward는 처음 요청받은 Servlet의 request, reponse를 다음 Servlet으로 넘겨줄 수 있고, url은 바뀌지 않으며 서버에서만 접근 가능하다는 특징이 있다.
https://youngjinmo.github.io/2020/08/servlet-redirect-forward/
Servlet - Redirect와 Forward
Redirect 위의 이미지를 설명하면, 리다이렉트는 클라이언트가 redirect01.jsp를 요청했더니 웹서버로부터 반환된 내용에 리다이렉트 내용이 있어서 웹서버로 다시 요청, 웹서버에서 최종적으로 redire
youngjinmo.github.io
https://best421.tistory.com/27
[JSP] JSP, Servlet ( forward, redirect )
1. forward 특정 서블릿에 대한 요청을 다른 서블릿이나 JSP로 넘겨준다. (파라미터를 넘길 수 있다.) 상대방에게 페이지 주소를 숨길 때 사용 할 수 있므며, redirect 보다 성능이 좋다. URL은 바뀌지않
best421.tistory.com
[ 3 ] css가 적용되지 않을 때
JSP에 css가 적용되지 않는 문제가 발생했었다. 내가 찾은 해결 방법들은 다음과 같다.
① WAS의 ContextPath에 맞게 태그의 src 속성 값을 설정한다.
② ServletFilter 확인
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request
, ServletResponse response
, FilterChain chain)
throws IOException, ServletException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}
만약 위와 같이 Encoding 방식을 UTF-8로 설정하는 ServletFilter의 annotation이 모든 파일("/*")에 적용되고 있는지 확인한다. 이는 css에도 적용될 수 있으므로 annotation의 경로를 변경해 준다.
③ 브라우저에 변경 전 css의 cache가 남아있어서 적용되지 않을 수 있다. 이를 해결하기 위해 '개발자 도구 → 캐시 비우기 및 강력 새로고침'을 실행한다.
필자는 ② → ③으로 해당 문제를 해결할 수 있었다.
[ 4 ] Port is already in use 해결 방법
가끔 eclipse가 튕긴 후 서버를 재시작할 때 "Port is already in use"가 발생했다. 구글에 검색하면 사용하고 있는 port의 ID를 찾아서 삭제하는 등의 방법이 나와있는데, 필자의 terminal로 tomcat 서버를 끈 후 eclipse에서 서버를 시작하니 해당 문제가 해결되었다.
terminal에서 tomcat 서버를 끄는 방법은 다음과 같다.
- tomcat 디렉토리 / bin 폴더 / ./shutdown.sh (os : Mac)
cf) Finder에서 tomcat 디렉토리 / bin 폴더로 이동 후 command + option + c를 하면 쉽게 path를 복사할 수 있다.
[ 5 ] StringBuilder를 사용하는 이유
자바에서 문자열을 다룰 때 String 객체가 있는데 StringBuilder를 사용하는 이유는 무엇일까?
자바에서 두 개의 문자열이 있고, 그것들을 이어줘야 하는 경우가 있다고 가정하자.
String a = "aa";
String b = "bbb";
System.out.println(a+b);
단순히 문자열 a와 b를 더해주는 연산을 하면 될 것이다.
해당 연산은 기존의 a에 b가 더해지는 과정으로 수행될 것 같지만, String은 '불변 객체'이기 때문에 a + b는 새로운 String을 만들어 내게 된다. 즉, String 객체를 더하는 연산을 많이 하면 할수록 메모리 할당과 해제가 많이 나타나 성능이 저하되는 것이다.
이를 해결하기 위해 StringBuilder를 사용한다. StringBuilder는 String과 새로운 문자열을 더할 때 새로운 객체를 생성하지 않고, 기존의 데이터에 더하는 방식을 사용하므로 속도가 빠르고 String에 비해 부하가 적다.
이를 인지하며 String 객체를 더하는 연산이 많을 경우 StringBuilder를 사용하도록 하자.
'나에 대한 기록' 카테고리의 다른 글
[기록] 2월 넷째 주 (1) | 2023.02.23 |
---|---|
[독서 기록] 스프링5 프로그래밍 입문 - 최범균 저 (5) | 2023.01.29 |
[기록] 매일 코딩하기 - 11월 셋째 주 (Servlet 출력-입력 형식, 서블릿 필터, 입력 데이터 배열로 받기) (1) | 2022.11.14 |
[기록] 매일 코딩하기 - 11월 둘째 주 (Servlet 기초) (1) | 2022.11.11 |
[기록] 매일 코딩하기 - 11월 첫째 주(웹 기초, tomcat) (1) | 2022.11.07 |