서비스 객체 분리 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

1. AOP란? Aspect Oriented Programming이다. customer가 원하는 주 기능을 구현하는 것 말고도 개발자나 운영자에게 필요한 기능이 있을 수 있다. 예를 들어 보안 처리, 트랜잭션 처리, 로그처리 같은 것이다. 이러한 기능들은 주 기능 앞뒤에서 실행하기 때문에 Cross-cutting Concern 코드라고 한다. 2. AOP 구현 방식 이 Cross-cutting 관점 코드를 주 기능의 앞뒤에 굳이 작성하여 넣는다면 필요가 없어질 시에 불편함을 만들어낼 수 있다. 그래서 Cross-cutting 관점 코드는 따로 둔 후에, Cross-cutting 관점 코드를 거친 후 Core 관점 코드를 사용하도록 하는 것이 AOP 구현 방식이다. 즉, Cross-cutting 관점 코드..
1. 어노테이션(Anntotation) 방식 ? 저번엔 xml 방식에 대해 배웠고, 오늘은 Annotation 방식에 대해 작성하려 한다. xml 방식은 최근에는 그다지 많이 사용되지 않는 방법이다. 개발 스타일이 'xml 설정 파일'에서 '어노테이션'으로 바뀌고 있다. 어노테이션은 클래스나 메소드, 필드 등의 선언문에 쓴 "@ 기호로 시작하는 텍스트"이다. 메소드나 클래스에 간단한 단어를 쓰는 것만으로 필요한 작업을 수행 할 수 있으므로 설정 파일에 사용하는 것에서 어노테이션 방식으로 전환되고 있다. 2. Bean 설정 클래스 생성 어노테이션 방식은 Bean 설정 파일을 사용하지 않고, Java의 클래스로 작성하는 방식이다. Bean을 설정할 자바 클래스를 하나 생성한다. package spring.d..