lower_bound - 이진탐색(Binary Search)기반의 탐색 방법이다. (배열 또는 리스트가 정렬 되어있어야 한다.) - lower_bound는 찾으려 하는 key값이 "없으면" key값보다 큰 가장 작은 정수 값을 찾는다. - 같은 원소가 여러개 있어도 상관 없으며, 항상 유일한 해를 구할 수 있습니다. - 헤더 파일에 있음 STL의 lower_bound 함수 template ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val); 반환형이 Iterator 이므로 vector container인 경우에는 iterator에서 v.begin()을 뺀 값으로 몇 번째 인자인지 계산을 하고, 배열인..
어노테이션을 이용하여 컨트롤러를 구현하는 방식의 가장 큰 장점 1) 컨트롤러 타입에 제한이 없다 다른 컨트롤러를 구현하는 방식들은 정해진 인터페이스를 구현해야 되요. 하지만 어노테이션은어느 클래스든지 컨트롤러가 될 수 있다. 2) 한 개의 컨트롤러에 하나 이상의 URL이 매핑될 수 있다 어노테이션을 이용하면 URL 매핑을 컨트롤러 클래스 단위가 아니라, 메소드 단위로 할 수 있다.**** 때문에, 요청의 타입이 늘어나도, 컨트롤러 내의 메소드만 늘어난다. @Component component-scan을 선언에 의해 특정 패키지 안의 클래스들을 스캔하고, @Component Annotation이 있는 클래스에 대하여 bean 인스턴스를 생성한다. @Controller, @Service, @Repositor..
2021년 1월 28일 오전 12:39이다. 막 하루가 넘어간 시점에 오늘 느낀 것에 대해 글을 써보려고 한다.😎 지금까지 xml을 이용하는 방식으로 스프링을 배우고 구현해보았다. "프레임워크" 라는 것은 처음 배우는 것이었기 때문에 이론적으론 알아도 어떻게 쓰이는 지 와닿지가 않았었다. 하나하나 배우면서 프레임워크의 용도는 이런것이구나 , 이런 점이 편해지는구나가 조금씩 느껴졌다. 일단 내가 지금까지 배우고 느낀 스프링 프레임워크는 모든 페이지에서 행해야하는 노가다 일을 한번에 관리할 수 있도록 줄여주는 것, 객체 의존성을 낮춰주는 것, 결합력을 낮춰주는 것, servlet 설정을 편하게 할 수 있는 것이라고 생각이 들었다. 프로젝트가 커지고 페이지가 많아지고 기능이 많아지면, xml을 이용하는 방식 ..
정적 파일 서비스 하기 WEB-INF 안의 내용들은 기본적으로 접근이 불가하다. 예를 들어 css나 js나 image 파일들은 접근이 불가하다. 그런데 jsp파일은 접근이 가능하다. 왜일까? dispatcher / web.xml 파일에 보면 dispatcher의 servlet-mapping의 url-pattern을 / 로 지정했었다. /* 로 지정하면 jsp파일 까지 접근 불가능하도록 막는 것이고, / 로 지정하면 jsp파일만 요청에 대한 컨트롤러를 찾는다는 뜻이다. 그러니 css나 js, image 폴더의 파일들은 접근할 수 없다. 근데 그렇게 되면 js나 css 등 자원 파일들을 jsp에서 불러오지 못하는 문제점이 생긴다. 그래서 접근을 할 수 있도록 지정할 수 있다. [ dispatcher-serv..
서비스 객체 분리 service 객체에서 데이터베이스에 접근한다. 다만 직접적으로 service 객체를 가져다가 쓴다면, 결합력이 높아지고 이는 문제점을 일으킨다. 다른 종류의 service 객체를 사용할 때가 오면, 그때 그때 바꿔줘야하기 때문. 그래서 service interface를 만들고 그 아래에 여러 종류의 service를 만들어서 결합력을 낮출 수 있다. 아직 배우지않았지만 나중에 DAO라는 것으로 service 객체를 구분할 것이다.! 연결 정보 분리 service 객체 클래스마다 데이터베이스 연결 정보를 코드로 작성할 것이 아니라, xml 파일에 지정하여 한번에 관리하고 가져다가 쓰는 것이 바람직하겠다. 위와 같이 DataSource를 분리하고, 컨트롤러에서 dataSource.getCo..
페이지 모듈 분리하기 페이지마다 Header나 Footer와 같이 공통적으로 들어가는 요소들이 있다. 만약, Header의 코드를 고쳐야 한다면 모든 페이지의 Header를 일일이 고쳐야하는 불편함이 생긴다. 이러한 문제점을 막기 위해서 페이지의 공통 분모 집중화하는 것이 필요하다. 공통적으로 들어가는 코드들은 각각 jsp파일을 만들어 묶는다. 레이아웃 까지도 따로둔다. 😲 직접 예제 프로젝트의 페이지 모듈을 분리해보니 예전 웹프로그래밍 수업의 프로젝트가 생각났다. php 웹페이지였고, 막 웹에 대해 처음 배울 때였다. 그 때도 모든 페이지의 공통적으로 들어가 있는 코드들이 많았는데, 고칠때마다 모든 페이지의 코드를 고쳐야하니 매우 불편했다.. 사실 업무에서 이런 현상이 있다는건 말이 안되는 일이다..!..
문자열과 정렬을 이용한 문제다. 클래스를 이용하여 어렵지 않게 풀었지만 그냥 정렬만을 이용하여 간단히 푼 풀이를 봤다. 충분히 나도 생각할 수 있는 수준이었다. 풀이를 보고 이해한 후에 다시 한번 풀어봤다. 다음에 비슷한 문제를 풀 때는 이렇게 간단하게 풀 수 있었으면 좋겠다. 그 때 생각이 났으면 좋겠다는 바람으로 정리를 해보려고 한다. 근데 속도는 내 코드가 훨씬 빠르게 나오는데 뭐가 더 좋은 코드인걸까..?! 어렵당 😨 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램의 과거 버전을 모두 담고 있어, 이름 순으로 정렬된 파일 목록은 보기가 불편했다. 파일을 이름 순으로 정렬하면 ..

1. Dispatcher-Servlet 이란? Servlet Container에서 HTTP프로토콜을 통해 들어오는 모든 요청을 프레젠테이션 계층의 제일앞에 둬서 중앙집중식으로 처리해주는 프론트 컨트롤러(Front Controller)를 말한다. 쉽게 말하자면, 클라이언트로부터 어떠한 요청이 오면 Tomcat(톰캣)과 같은 서블릿 컨테이너가 요청을 받는다. 이때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는 프론트 컨트롤러를 Spring에서 정의하였고, 이를 Dispatcher-Servlet이라고 한다. 그래서 공통처리 작업을 Dispatcher-Servlet이 처리한 후에 적절한 세부 컨트롤러로 작업을 위임해준다. 흐름은 다음과 같다. 기존의 방식은 컨트롤러 하나당 서블릿을 만들었었는데, 프론트 컨트..
문자열을 나누는 stringstream C++에서 stringstream은 주어진 문자열에서 필요한 자료형에 맞는 정보를 꺼낼 때 유용하게 사용된다. stringstream에서 공백과 '\n'을 제외하고 문자열에서 맞는 자료형의 정보를 빼낸다. #include 전처리 헤더를 포함해야한다. 예제를 보자! #include #include #include int main() { int num; string s; string str1 = "123 456", str2 = "hello world!"; stringstream stream1, stream2(str2); //초기화 stream1.str(str1); while(stream1 >> num){ cout s){ cout s[1] >> s[2] >> s[3]; }
transform 함수 STL라이브러리에서 가져 왔으며 주어진 함수를 범위에 적용 할 수 있다. toupper 함수 string 문자 범위에서 작동하고 toupper 함수를 사용하여 각char를 대문자로 변환합니다. tolower 함수 string 문자 범위에서 작동하고 toupper 함수를 사용하여 각char를 소문자로 변환합니다. #include #include #include using namespace std; int main() { string s = "lksajdaliwudsk"; transform( s.begin(), s.end(), s.begin(), [](unsigned char c){ return toupper(c); }); cout