![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/pc7pB/btq1IqQ1Xs3/8cfaKqBzVAIaEo74XLE22K/img.png)
Validator 클라이언트가 작성한 폼 객체를 검사하지 않으면 데이터베이스에 잘못된 데이터가 들어가 오류를 일으킬 수 있습니다. 또한 확인을 통해 잘못된 값이 들어왔다는 것을 확인하더라도 클라이언트가 에러 메시지를 받지 못하면 어떠한 이유에서 가입을 실패했는지 알 수 없어 서비스를 제대로 이용할 수 없게 됩니다. 스프링은 이를 해결하기 위해 다음의 두 인터페이스를 제공합니다. org.springframework.validation.Validator org.springframework.validation.Errors Validator은 아래와 같은 인터페이스를 사용합니다. public interface Validator{ boolean supports(Class clazz); void validate(O..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bODJ9D/btq1s24zXuh/l811KJXWEnysGafwchqKF0/img.png)
문제 www.acmicpc.net/problem/21234 알고리즘 스위핑 풀이 N * N 사각형안에 값들이 주어집니다. 부분 직사각형안에 최솟값이 100이 될 수 있는 직사각형의 갯수를 구하는 문제입니다. 사각형을 결정하기 위해선 상하좌우의 변이 필요합니다. 다르게 말하자면 브루트포스로 해결하기 위해선 $O(N^4)$의 시간복잡도가 필요하므로 시간초과입니다. 한 직사각형의 위와 왼쪽변을 결정했다고 가정하겠습니다. 이 변들을 포함하며 최솟값이 100이 되는 직사각형들을 찾기 위해서는 왼쪽변보다 오른쪽에 위치한 변들을 살피며 그때 아래변들을 살펴보면 됩니다. 이 과정은 위에서 언급한대로 $O(N^4)$의 시간복잡도를 필요하지만 아래변들을 살필 때 우리가 찾는 것은 가장 높은 100의 위치(A)와 포함해서는..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bj5AWg/btq1g93cI6s/sKBnaSPX0KtcDFmLlhpesk/img.png)
이메일을 전달하기 위해 아래와 같은 폼을 사용했다고 가정하겠습니다. 이메일 이메일을 사용하는 폼은 굉장히 많습니다. 만일 이메일을 이메일 주소로 변경하려고 한다면 이렇게 하드코딩된 코드들을 일일이 찾아 수정해야합니다. 또한 사용자의 접속 환경에 따라 보여주는 글자를 다르게 하고 싶을 때도 마찬가지입니다. 스프링은 이러한 문제점을 해결하기 위해 메세지 태그를 제공합니다. 메세지 태그를 사용한다면 다음과 같이 바꿀 수 있습니다. 을 사용한 곳은 메세지 파일에서 지정한 글자로 바뀌게 됩니다. 메세지 태그를 사용하기 위해 세가지를 준비해야합니다. 문자열을 담은 메세지 파일 메세지 파일에서 값을 읽어올 MessageSource 빈 JSP에서 이를 사용하는 태그 메세지 파일은 클래스패스안에 위치한 폴더에 .prop..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/c8SEYb/btq0SHGOhuz/uxWVg3SthlhiU3BuOTQaeK/img.png)
요청 매핑 웹 개발은 크게 클라이언트 요청 URL을 처리할 코드를 작성하거나 처리 결과를 페이지에 출력해줄 코드를 작성하는 것입니다. 첫 번째는 dispatcherServlet이 요청받은 URL을 처리해줄 Controller을 작성하는 것입니다. 컨트롤러 클래스는 요청 매핑 어노테이션을 이용해서 메서드가 처리할 경로를 지정할 수 있습니다. package controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.spri..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/WiDmz/btq0DsJVsca/OdwofoKHnMl26oLbpdBxy0/img.png)
Transaction 두 개 이상의 쿼리를 한 작업으로 실행해야 할 때 사용하는 것이 트랜잭션입니다. 한 트랜잭션에 묶인 쿼리들 중 한개라도 실패하면 이전상태로 돌아가는 rollback을 수행하고 모든 쿼리들이 성공하면 해당 상태를 업데이트하는 commit을 수행합니다. @Transactional 트랜잭션 처리를 편리하게 하기 위해 @Transactional 어노테이션을 사용합니다. 트랜잭션 범위에서 실행하고 싶은 메서드에 어노테이션을 붙이면 됩니다. package spring; import org.springframework.transaction.annotation.Transactional; public class ChangePasswordService { private MemberDao memberD..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bMXtGE/btq0zuVgwGP/x6Y9kYkVtSlKkfk8UKVEl1/img.png)
web.xml 웹 요청이 발생하면 우선적으로 톰캣이 해당 요청을 받게 됩니다. web.xml은 톰캣의 환경설정에 해당하는 파일입니다. 들어가야할 내용은 Servlet에 대한 설정들입니다. dispatcher org.springframework.web.servlet.DispatcherServlet contextClass org.springframework.web.context.support.AnnotationConfigWebApplicationContext contextConfigLocation config.MvcConfig config.ControllerConfig 1 dispatcher / encodingFilter org.springframework.web.filter.CharacterEncoding..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/dtxCP2/btq0nOznxwl/SHBFjnpjCHKQ6Y1bE7kkiK/img.png)
프록시 생성방식 스프링은 프록시를 생성할 때, 실제 생성할 빈 객체가 인터페이스를 상속하면 프록시 타입 또한 해당 인터페이스를 상속해서 만들어지게 됩니다. 즉 다음과 같은 코드는 오류가 발생합니다. //in Configuration code.. @Bean public Calculator calculator() { return new REcCalculator(); } package main; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import chap07.Calculator; import chap07.REcCalculator; import config.AppCtx; public class MainAs..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/NQlJG/btq0n9PZS6q/EVQ3bnifnz3XijaGwOWUfK/img.png)
문제 www.acmicpc.net/problem/21233 알고리즘 greedy 풀이 12의 배수에 해당하는 연도에 포탈이 열립니다. 모든 선조들을 만나고 돌아올 때, 걸리는 가장 짧은 시간을 구하는 문제입니다. 포탈은 최대 $K$번 이용할 수 있습니다. 전형적인 그리디 문제입니다. 포탈을 사용해서 건너뛰어야하는 구간은 연도차이가 가장 큰 구간입니다. 각 선조들의 연도를 거쳐야만 하는 연도(12의 배수중 하나)로 바꿉니다. 예를 들어 35년 전에 존재하는 선조는 36년도 전에 열리는 포탈을 거쳐야만 (또는 더 이전의 포탈에서 시간이 흘러야만) 올 수 있습니다. 거쳐야하는 포탈을 골랐다면 각 포탈의 차이(A포탈의 시작과 B 포탈의 끝)를 담는 벡터를 만든 후, 정렬해서 가장 큰 것부터 $K-1$개를 제외해..
- Total
- Today
- Yesterday
- dfs
- sorting
- bfs
- 스위핑
- implementation
- string
- DP
- spring boot
- greedy
- 동적계획법
- union find
- Suffix Array
- 펜윅트리
- spring
- Segment tree
- dijkstra
- Fenwick
- 트라이
- Oracle
- 2-SAT
- 세그먼트트리
- kmp
- sweeping
- hld
- SCC
- 정렬
- knapsack
- 좌표압축
- 이분탐색
- 이분매칭
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |