본문 바로가기

전체 글

(65)
API 스프링 웹 개발을 할 때에는 API의 방식을 활용하기도 한다. 사실 정적 컨텐츠(static content) 방식을 제외하면 MVC 방식에서 view를 찾아서 템플릿 엔진을 통해 화면을 렌더링해서 html을 웹 브라우저에 넘겨주는 방식이 있고, 그 다음에 API를 써서 html이 아니라 데이터를 바로 내리는 방식이 있다. @ResponseBody를 사용 HTTP의 BODY에 문자 내용을 직접 반환 viewResolver 대신에 HttpMessageConverter가 동작 기본 문자처리: StringHttpMessageConverter 기본 객체처리: MappingJackson2HttpMessageConverter byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음..
MVC와 템플릿 엔진 MVC: Model, View, Controller 프로그래밍을 할 때에는 관심사를 분리해야 한다. 역할과 책임. View는 화면을 그리는 데에 모든 역량을 집중해야 한다. 반면 Controller나 Model과 관련된 부분들은 비즈니스 로직과 관련이 있거나, 무언가 내부적인 것을 처리하는 데에 집중해야 한다. 그래서 Model, View, Controller를 나누는 것이다. 요즘에는 Controller와 View를 쪼개는 것이 기본이다. 요즘에는 이러한 방식으로 웹 개발을 많이 한다. 웹 브라우저에서 localhost:8080/hello-mvc를 넘기면, 일단 스프링 부트가 띄울 때 같이 띄우는 내장 톰캣 서버를 먼저 거친다. 내장 톰캣 서버는 "어, hello-mvc라는 것이 왔어"라고 하면서 스프..
정적 컨텐츠 (Static Content) 웹을 개발한다는 것은 크게 3가지 방법이 있다. 정적 컨텐츠, MVC와 템플릿 엔진, 그리고 API이다. 스프링 부트는 정적 컨텐츠(static content)를 자동으로 제공한다. 정적 컨텐츠는 서버에서 무언가 하는 것 없이 그냥 파일을 그대로 웹브라우저에 내려주는 것이다. 웹브라우저에서 localhost:8080/hello-static.html을 입력하면, 내장 톰캣 서버가 우선 요청을 받는다. 그리고 톰캣은 스프링에게 이것을 넘긴다. 스프링은 먼저 컨트롤러 쪽에서 hello-static이라는 컨트롤러가 있는지 찾는다. 그런데 hello-static과 관련되어 매핑된 컨트롤러가 없다. 그러면 스프링 부트는 내부의 resources에 있는 static 폴더 안의 hello-static.html을 찾는다..
스프링 부트 (Spring Boot) 동작 환경 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버(viewResolver)가 화면을 찾아서 처리한다. 스프링 부트 템플릿 엔진은 기본적으로 viewName 매핑이 된다. `resources:templates/` + {ViewName} + `.html` 위 그림을 볼 때, 웹 브라우저에서 'localhost:8080/hello'라고 해서 던지면, 스프링 부트는 톰캣이라는 웹 서버를 내장하고 있다. 톰캣에서 이것을 받아서 "어, /hello네" 하고 스프링에게 물어본다. 스프링의 helloController를 보면 @GetMapping("hello")라는 것이 있다. package hello.hellospring.controller; import org.springframework.stereotype.Co..
throw, throws 지금까지는 남들이 발생시키는 예외에 대해서 처리하는 방법에 대해 알아보았다면, 우리가 우리의 코드에서 예외를 발생시킬 수도 있다. throw new Exception("문제가 발생했습니다."); throw new RuntimeException("문제가 발생했습니다."); public class MyException { public static void main(String[] args) { throw new RuntimeException("무언가 문제가 있습니다."); } } 이렇게 문제 상황이 발생했을 때, throw 구문을 통해서 예외를 발생시킬 수 있다. 이 경우에는 RuntimeException 객체를 이용하였지만, Exception 객체도 우리가 직접 생성할 수 있다. try catch 문으로 ..
try with resource 자원을 잡고, 놓아주는 작업을 try catch finally 문으로 만드는 과정은 상당히 복잡했다. 그래서 자원을 잡고, 놓아주는 작업을 간단한 형식으로 만들 필요성이 생겼다. JAVA SE 7 이전에는 finally 문을 이용하여 자원을 놓아주는 작업을 진행했다. 하지만 JAVA SE 7부터 try-with-resource 문이 등장하여 자원 관리를 훨씬 단순하게 할 수 있게 되었다. 클래스가 AutoCloseable 인터페이스를 상속한다면 try-with-resource 문을 사용할 수 있다. FileWriter로 만들어진 앱은 반드시 close를 해줘야 한다. 위 사진을 보면, FileWriter 클래스는 AutoCloseable 인터페이스를 상속하고 있음을 알 수 있다. try 다음에 바로 중괄..
finally 우리의 프로그램은 프로그램 외부의 자원(Resource)에 접근해서 작업을 진행할 수 있다. 대표적인 자원으로는 파일, 네트워크, 데이터베이스 등이 있다. 이러한 자원들은 프로그램 외부에 존재하기 때문에 우리의 프로그램이 온전히 제어하지 못한다. 우리의 프로그램만을 위해 존재하지 않기 때문에 읽기나 쓰기 작업을 하는 도중에 상황에 따라 연결이 불량하여 작업이 실패할 수 있다. 그래서 이러한 자원을 사용할 때는 자원을 붙들기 위해 파일의 경우 점유상태를 나타내기도 하고, 네트워크나 데이터베이스는 연결 상태를 유지한다. 그리고 우리가 필요한 작업을 끝내고 나서는 자원을 놓아주는 작업을 한다. 작업이 끝나고 붙잡고 있던 것을 놔줘야 한다. 이때 공통적으로 사용되는 메소드가 close 이다. try 문에서 오류..
Checked Exception vs Unchecked Exception 앞서 알아본 ArithmeticException, ArrayIndexOutOfBoundsException 같은 경우 try catch 문으로 잡아내지 않아서 프로그램이 뻗는다고 할지라도, 컴파일해서 실행할 수 있기는 했다. 이러한 Exception들을 Unchecked Exception이라고 부른다. Unchecked Exception은 모두 RuntimeException 클래스로부터 상속된 예외들이다. 하지만 try catch 문 등으로 잡아내지 않으면 프로그램이 컴파일도 안 되는 예외들이 있다. 이러한 예외들을 Checked Exception이라고 부른다. Throwable로부터 상속된 모든 클래스에서 RuntimeException을 제외한 모든 에러와 예외들이 Checked Exception에 속한..