[Spring Basic] 서블릿과 출력
보통 자바의 main메서드 옆에는 String[] args가 붙어있는 경우가 많다.
여기서 args가 의미하는 바는 cmd에서 자바 인터프리터로 프로그램을 실행할 때 추가되는 문자열을 담기 위한 배열이다.
(프로그램이 사용자로부터 입력을 받거나 다른 프로그램과 데이터를 주고받을 때 사용된다)
java Main.java arg1 arg2 arg3 이런 식으로 프로그램을 실행하면 arg1은 arg[0] 에, arg2는 arg[1] 에.. 이런 방식으로 args 배열이 설정된다.
마찬가지로, 브라우저에서 URL을 통해 호출을 진행하면 Tomcat이 HttpServletRequest객체를 만들고 요청한 정보를 담은 후 main메서드의 매개변수로 넘겨준다.
public void main(HttpServletRequest request){
}
바로 이런 형식인데, 스프링을 다룰 때는 String[] args보다 HttpServletRequest를 많이 보게 될 예정이다.
필요한 요소를 main메서드의 매개변수로 선언해 놓으면, Tomcat으로부터 정보를 받아올 수 있다. (Spring이 알아서 처리함)
위의 예시에서는 HttpServletRequest타입의 변수 request를 통해 받아온 정보를 활용할 수 있다.
HttpServletRequest 객체의 메서드이다.
각각의 메서드를 통해 URL의 특정 정보를 얻어올 수 있다.
외우지는 말고, 필요할 때 찾아서 사용하자.
뒤에 위치하는 QueryString부분은 getParameter() 함수로 따로 값을 얻어와 처리할 수 있다.
자바를 사용할 때 콘솔에 값을 출력하려면 System.out.println() 함수를 사용했다.
public final class System {
private static native void registerNatives();
static {
registerNatives();
}
private System() {
}
public static final InputStream in = null;
public static final PrintStream out = null;
....
}
public class PrintStream extends FilterOutputStream
implements Appendable, Closeable
{
private final boolean autoFlush;
private boolean trouble = false;
private Formatter formatter;
private BufferedWriter textOut;
private OutputStreamWriter charOut;
private static <T> T requireNonNull(T obj, String message) {
if (obj == null)
throw new NullPointerException(message);
return obj;
}
...
}
System : java.lang 패키지에 있는 final 클래스로 표준 입출력 가비지컬렉션 등 여러 시스템 관련 필드 정보가 포함된다.
out : System 클래스의 static 필드로 표준 출력 스트림을 참조한다. out은 PrintStream 타입으로 콘솔 출력에 사용된다.
println : PrintStream 클래스에 정의된 메서드로
System.out.println(); 함수로 출력하게 되면 자바 콘솔창에만 출력할 수 있고 브라우저에는 출력할 수 없다.
브라우저에서 출력하기 위해서는 몇 가지가 더 필요하다.
public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {}
우선 HttpServletResponse타입의 값을 Tomcat에 요청해야한다.
그 다음 받아온 정보를 활용해 몇 가지 작업을 수행한다.
response.setContentType("text/html"); // 응답의 형식을 html로 지정
response.setCharacterEncoding("utf-8"); // 응답의 인코딩을 utf-8로 지정
PrintWriter out = response.getWriter(); // 브라우저로의 출력 스트림(out)을 얻는다.
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello, World!</h1>");
out.println("</body>");
out.println("</html>");
위와 같이 처리해주면 out.println() 함수를 통해 이제는 브라우저로 출력을 보낼 수 있다.
브라우저는 html로 구성되어있어 웹을 제대로 구성하려면 out.println() 함수로 html태그도 함께 출력해야 한다.
콘솔에 출력할 때와 다르게 브라우저에게 출력값을 반환할 때는 HTTP 프로토콜로 통신하고, 요청을 처리하는 기술인 Servlet을 사용해서 처리해야 한다.
서블릿은 클라이언트의 요청을 처리하는 기술으로, 서버 측 프로그램이다.
클라이언트가 서버에 요청을 보내면 서버는 적절한 서블릿을 찾아서 요청을 처리하고 응답을 반환한다.
스프링 프레임워크는 내부적으로 디스패처 서블릿을 사용해서 알맞은 컨트롤러에게 요청을 전달하는 방식으로 동작한다.
서블릿에서 웹 브라우저에게 응답값을 전달할 때는 HttpServletResponse 객체를 사용하고, 위와 같이 자바에서 텍스트를 출력할 때 사용되는 클래스인 PrintWriter 클래스를 사용해 HTML을 작성한다.
요즘은 저렇게 하지는 않고.. JSP나 Thymeleaf 등 템플릿 엔진을 사용하거나 REST API 방식으로 데이터만 전달하는 방식을 사용한다.
위의 예시에서는 HTTP 관련 설정을 수동으로 직접 해 줘야 됐는데, 스프링 MVC 프레임워크는 알아서 적절한 Content-Type 헤더, Encoding 등을 설정해준다.
REST API 방식을 사용하는 경우는 @ResponseBody 애너테이션을 붙여서 메서드 반환 값을 HTTP 바디에 바로 전송할 수 있다.
스프링의 메세지 컨버터가 적절한 HTTP 설정을 수행해준다.
서버 프로그래밍은 요청을 받으면 요청에 따라 html을 동적으로 만들어 주는 것이 서버의 역할이다. (프론트와 백엔드가 구분되는 경우 JSON 형식의 데이터를 반환하기도 한다)
서버는 실행 시 마다 결과가 바뀌는 동적 리소스와, 고정되어있는 정적 리소스로 두 가지 종류의 리소스를 제공한다.
정적 리소스로는 html, js, css, img 등이 있고, 프로그램이 생성하는 결과나 스트리밍 등은 동적 리소스에 해당한다.
'Spring > Spring' 카테고리의 다른 글
[Spring Basic] 파라미터의 변환과 검증 (0) | 2022.06.24 |
---|---|
[Spring Basic] DispatcherServlet (0) | 2022.06.23 |
[Spring Basic] 리다이렉트와 포워드 (0) | 2022.05.12 |
[Spring Basic] 서블릿과 JSP (0) | 2022.05.05 |
[Spring Basic] Java Reflection API (0) | 2022.04.13 |
댓글
이 글 공유하기
다른 글
-
[Spring Basic] DispatcherServlet
[Spring Basic] DispatcherServlet
2022.06.23 -
[Spring Basic] 리다이렉트와 포워드
[Spring Basic] 리다이렉트와 포워드
2022.05.12 -
[Spring Basic] 서블릿과 JSP
[Spring Basic] 서블릿과 JSP
2022.05.05 -
[Spring Basic] Java Reflection API
[Spring Basic] Java Reflection API
2022.04.13