분류 전체보기
[Spring Web MVC] Adaptor
[Spring Web MVC] Adaptor
2022.08.16서버에서 클라이언트로 데이터를 전송할 때 ModelView 객체를 만들어서 데이터를 전송하기도 하고 Map 자료구조를 사용해 데이터를 전송하는 방식도 경험 해 봤는데.. 특정 부분에는 첫 번째 방식을, 또 어느 부분에는 두 번째 방식을 사용해 데이터를 전송하게 할 수는 없을까? 어댑터 패턴을 사용하면 프론트 컨트롤러가 다양한 방식의 컨트롤러를 처리할 수 있다. 핸들러 : 클라이언트의 요청을 처리하는 객체 (컨트롤러) 클라이언트의 요청의 URL에 따라 매핑된 정보를 핸들러 매핑을 통해 조회한다. 그 후 프론트 컨트롤러는 해당 컨트롤러를 직접 호출하지 않고 핸들러 어댑터를 통해 호출해야 한다. 핸들러 어댑터에게 핸들러를 넘겨주면 핸들러 어댑터는 해당하는 핸들러를 호출해 실행 결과를 받고 프론트 컨트롤러에게 ..
[Spring Web MVC] Model
[Spring Web MVC] Model
2022.08.15컨트롤러 입장에서는 request 객체를 Model로 활용하는 것 외에는 사용하지 않는다. 그러면 Model 객체를 따로 만들면 컨트롤러는 request와 response를 아예 신경쓰지 않게 할 수 있지 않을까? 또, 뷰의 이름에서 중복되는 부분을 프론트 컨트롤러가 단순화하도록 하면 뷰의 이름도 간단하게 작성할 수 있지 않을까? 귀찮은 일은 프론트 컨트롤러로 등록된 서블릿에게 맡기고, 핵심 로직은 컨트롤러가 맡도록 하자. @Getter @Setter public class ModelView { private String viewName; private Map model = new HashMap(); public ModelView(String viewName) { this.viewName = viewNa..
[Spring Web MVC] Front Controller
[Spring Web MVC] Front Controller
2022.08.15프론트 컨트롤러를 도입해 공통되는 요소를 하나로 묶어서 처리할 수 있다. 프론트 컨트롤러 역할을 수행하는 서블릿 하나로 클라이언트의 요청을 받고, 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출한다. 해당 컨트롤러만 서블릿으로 등록해서 사용할 수 있어 편리하다. public interface ControllerV1 { void process(HttpServletRequest request , HttpServletResponse response) throws IOException, ServletException; } 서블릿과 비슷한 형태의 컨트롤러 인터페이스를 도입하자. 각 컨트롤러들은 해당 인터페이스를 구현하고, 프론트 컨트롤러는 인터페이스를 호출해 구현에 상관 없이 로직의 일관성을 가진다. @We..
[Spring Web MVC] 서블릿과 HTTP 통신
[Spring Web MVC] 서블릿과 HTTP 통신
2022.08.14서블릿을 직접 사용해보자. @WebServlet(name = "helloServlet", urlPatterns = "/hello") public class HelloServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("start!"); } } @ServletComponentScan 애너테이션으로 스프링이 서블릿을 등록해서 사용할 수 있도록 하자. @WebServlet 애너테이션은 서블릿 이름과 URL 매핑을 지정한다. 스프링이 내장 톰캣 서버를 실행한다...
[백준] 1325 효율적인 해킹 - Java
[백준] 1325 효율적인 해킹 - Java
2022.08.14시간 제한이 좀 까다롭다. 최대한 시간을 줄여야 한다. bfs로 작성했는데.. 그냥 출력하면 시간초과가 발생한다. StringBuilder로 출력을 최대한 줄여야 한다. import java.util.*; import java.io.*; import java.math.*; public class Main { static ArrayList[] list; static int N, M; static int max = 0; static ArrayList ans_list = new ArrayList(); public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader..
[Spring Web MVC] 웹 애플리케이션
[Spring Web MVC] 웹 애플리케이션
2022.08.13웹은 HTTP 프로토콜을 기반으로 통신한다. Web Server : 정적 리소스와 기타 부가기능을 제공한다. (APACHE, nginx) Web Application Server : 웹 서버 기능 + 동적 리소스를 제공한다. (Tomcat) / 애플리케이션 코드를 실행하는데 특화됨. 스프링 MVC는 WAS 에서 동작한다. 웹 시스템은 WEB / WAS / DB로 구성된다. 웹 서버는 정적 리소스를 처리하고, 중요한 애플리케이션 로직은 웹 애플리케이션 서버가 담당한다. WAS 하나로 두 작업을 함께 처리할 수도 있지만, 서버의 안정성과 효율적인 리소스 관리를 위해 이렇게 설계하는 편이 합리적이다. 이렇게 설계 시 웹 애플리케이션 서버가 죽더라도 웹 서버가 살아서 클라이언트에게 오류 메세지를 보내줄 수 있다..
PICNIC - Java
PICNIC - Java
2022.08.13백트래킹 시 같은 경우를 중복해서 세고 있을 때 각각의 경우에 순서를 부여해 중복을 제거할 수 있다. 여기서는 사전순으로 가장 먼저 오는 답 하나만 세도록 작성했다. import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int TC = Integer.parseInt(br.readLine()); while(--TC >= 0){ StringTokenize..
[백준] 1600 말이 되고픈 원숭이 - Java
[백준] 1600 말이 되고픈 원숭이 - Java
2022.08.13K번만 나이트처럼 움직일 수 있다. 격자 위를 이동하면서 나이트처럼 움직인 수를 함께 확인해야 한다. 3차원 배열을 사용하자. bfs를 사용하면 제일 처음으로 목적지에 도착하면 그 때의 이동 횟수가 최소임을 보장할 수 있다. 바로 리턴해준다. 3차원 배열을 사용해 모든 경우를 확인할 수 있다. import java.util.*; import java.io.*; import java.math.*; public class Main { static int[][] map; static int K, N, M; static int ans = -1; static int[] dr = {-1,1,0,0}; static int[] dc = {0,0,-1,1}; static int[] hr = {-2,-2,-1,-1,1,1..
[HTTP] 헤더 / 쿠키와 캐시
[HTTP] 헤더 / 쿠키와 캐시
2022.08.13헤더에는 HTTP 전송에 필요한 모든 부가정보가 들어가 있다. (메세지 바디 내용, 크기, 인증, 요청 클라이언트, 서버 정보..) 표준 헤더는 수없이 많고, 임의로 헤더를 추가할 수도 있다. 헤더는 크게 4가지로 분류할 수 있다. (실제로는 더 복잡함) 1. General 헤더 : 메세지 전체에 적용되는 정보 2. Request 헤더 : 요청 정보 3. Response 헤더 : 응답 정보 4. Representation 헤더 : 과거 엔티티 헤더에서 이름이 바뀜. 메세지 바디를 통해 표현 데이터 전달 Representation 헤더 Content-Type : 표현 데이터의 형식을 알려준다. (html, xml, json 등등.. 메세지 바디에 들어가는 내용) Content-Encoding : 표현 데이..
[백준] 16235 나무 재테크 - Java
[백준] 16235 나무 재테크 - Java
2022.08.13하라는대로 하면 된다.. 이런 문제는 작업마다 메서드를 만들어서 접근해야 실수를 줄일 수 있다. import java.util.*; import java.io.*; import java.math.*; public class Main { static int N; static int[][] map; static int[][] A; static ArrayList[][] tree; static int[][] death; static int dr[] = {0,0,-1,1,-1,1,-1,1}; static int dc[] = {-1,1,0,0,-1,1,1,-1}; public static void main(String[] args) throws Exception { BufferedReader br = new Buf..
[HTTP] 상태코드
[HTTP] 상태코드
2022.08.12클라이언트가 보낸 요청에 대한 처리 상태를 응답 메시지에서 상태코드를 통해 알려준다. 100번대 (Informational) : 요청이 수신되고 처리중 200번대 (Successful) : 요청 정상 처리 300번대 (Redirection) : 요청이 완료되려면 추가 행동이 필요 400번대 (Client Error) : 클라이언트 오류 500번대 (Server Error) : 서버 오류 200번대 200 OK : 요청 성공을 의미함 201 Created : 요청에 성공하고 새로운 리소스가 반환됨 (POST 메서드를 사용한 경우 URI도 함께 반환) 202 Accepted : 요청이 접수됐지만 처리되진 않음 204 : No Content : 요청을 성공적으로 수행했지만 본문에 보낼 데이터가 없음. (임시저..
[HTTP] HTTP 메서드와 활용
[HTTP] HTTP 메서드와 활용
2022.08.12웹에서 HTTP를 통해 통신하는 경우를 생각해보자. 클라이언트는 주소 창에 URI를 입력해 서버에게 요청한다. 이 때 API URI는 어떻게 설계됐을까? (https://aws.amazon.com/ko/what-is/api/ API에 대한 설명은 이쪽을 참고하자.) URI는 리소스 식별에 집중해야 한다. 여기서 리소스는 웹 사이트의 회원이 있다면 그 회원 자체를 의미한다. 회원을 등록하는 작업이 있다면 회원 / 등록 으로 구분해서 생각해야 한다. 즉, 왼쪽 예시보다 오른쪽 예시가 더 괜찮게 설계됐다고 할 수 있다. 이렇게 되면 URI가 중복될 수 있는데, 이럴 때 HTTP 메서드를 사용한다. GET 리소스를 조회할 때 주로 사용한다. 서버에 전달하는 데이터는 쿼리를 통해 전달한다. GET 메서드를 통해 ..