전체 글

HTTP API를 제공하는 경우 데이터를 전달해야 하므로, http 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다. https://mystudylog.tistory.com/40 HTTP 요청 메시지 - 텍스트, JSON HTTP message body 데이터 조회 - text 요청 파라미터와 다르게, HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우는 @RequestParam , @ModelAttribute 를 사용할 수 없다 1. InputStream HTTP 메시지 바디의 데이 mystudylog.tistory.com 위 링크에서는 요청과 응답이 모두 정리되어 있으므로 여기서는 응답 부분만 정리하겠다. @GetMapping("/response-body-string-v1") publ..
서버에서 응답 데이터를 만드는 방법은 크게 3가지이다 정적 리소스: 정적인 HTML, css, js를 제공해서 응답하는 것 뷰 템플릿: 동적인 HTML을 제공할 때는 뷰 템플릿을 사용 HTTP 메시지 사용: HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다. 정적 리소스로 응답 스프링 부트는 클래스패스의 다음 디렉토리에 있는 정적 리소스를 제공한다. /static, /public, /resources, /META-INF/resources src/main/resources 는 리소스를 보관하는 곳이고, 또 클래스패스의 시작 경로이다. 따라서 다음 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스..
API 예시 회원 관리를 HTTP API로 만든다 생각하고 매핑을 어떻게 하는지 알아보자. 회원 관리 API 회원 목록 조회: GET → /users 회원 등록: POST → /users 회원 조회: GET → /users/{userId} 회원 수정: PATCH → /users/{userId} 회원 삭제: DELETE → /users/{userId} @RestController @RequestMapping("/mapping/users") public class MappingClassController { @GetMapping public String user() { return "get users"; } @PostMapping public String addUser() { return "post user..
HTTP message body 데이터 조회 - text 요청 파라미터와 다르게, HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우는 @RequestParam , @ModelAttribute 를 사용할 수 없다 1. InputStream HTTP 메시지 바디의 데이터를 InputStream 을 사용해서 직접 읽을 수 있다. @PostMapping("/request-body-string-v1") public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException { ServletInputStream inputStream = request.getInputStream(); Stri..
쿼리 파라미터, HTML From 1. request.getParameter() HttpServletRequest 의 request.getParameter() 를 사용하면 다음 두가지 요청 파라미터를 조회할 수 있다. GET, 쿼리 파라미터 전송 POST, HTML Form 전송 @RequestMapping("/request-param-v1") public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException { String username = request.getParameter("username"); int age = Integer.parseInt(request.getParamete..
요청 매핑 요청이 왔을 때 컨트롤러와 매핑해 주는 것 @RestController public class MappingController { private Logger log = LoggerFactory.getLogger(getClass()); /** * 기본 요청 * 둘다 허용 /hello-basic, /hello-basic/ * HTTP 메서드 모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE */ @RequestMapping("/hello-basic") public String helloBasic() { return "ok"; } } @RestController @RestController 는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다. @R..
스프링 test를 이용해서 체크예외와 언체크 예외를 비교해보자 체크 예외 기본 이해 체크 예외는 잡아서 처리하거나, 또는 밖으로 던지도록 선언해야한다. 그렇지 않으면 컴파일 오류가 발생한다. @Slf4j public class CheckedTest { @Test void checked_catch() { Service service = new Service(); service.callCatch(); } /** * Exception을 상속받은 예외는 체크 예외가 된다. */ static class MyCheckedException extends Exception { public MyCheckedException(String message) { super(message); } } /** * Checked 예외..
· 언어/JAVA
예외 계층 Error 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외. 애플리케이션 개발자는 이 예외를 잡으려고 해서는 안된다 상위 예외를 catch로 잡으면 하위 예외까지 함께 잡는다. 따라서 애플리케이션 로직에서는 Throwable 예외도 잡으면 안된다. Exception 애플리케이션 로직에서 사용할 수 있는 실질적인 최상위 예외이다. 체크 예외와 언체크예외로 나뉜다. Check Exception 체크 예외는 RuntimeException 클래스를 상속받지 않은 예외 클래스들이다. 체크 예외는 복구 가능성이 있는 예외이므로 반드시 예외를 처리하는 코드를 함께 작성해야 한다. 예외를 처리하기 위해서는 catch 문으로 잡거나 throws를 통해 메소드 밖으로 던질 ..
트랜잭션 추상화 + 트랜잭션 템플릿 이 두개를 도입해서 트랜잭션을 특정 기술에 의존하지 않도록하고, 반복적인 트랜잭션 로직을 해결했다. 하지만 아직 서비스 계층에 순수한 비즈니스 로직만 남기는 것을 해결하지 못했다. → AOP를 통해 프록시를 도입하면 문제를 깔끔하게 해결할 수 있다 @Transactional 을 사용 하면 스프링이 AOP를 사용해서 트랜잭션을 편리하게 처리해준다 정도로 이해해도 된다. 프록시를 통한 문제 해결 프록시 도입 전 프록시를 도입하기 전에는 기존처럼 서비스의 로직에서 트랜잭션을 직접 시작한다 프록시 도입 후 프록시를 사용하면 트랜잭션을 처리하는 객체와 비즈니스 로직을 처리하는 서비스 객체를 명확하게 분리할 수 있다 프록시 코드 예시 public class TransactionP..
hapBday
개발자로 성장하기 위한 기록들