자 우리가 저번시간까지 전자정부프레임워크에서 만들어놓은 기본 예제를 실행시켰다. 일단. 이프로젝트가 저번에 실행시켜서 보아하니 간단한 게시판 웹 페이지를 구현해 놓은 것같다.
이제 우리가 웹 서비스를 만들꺼니 당연히 구조를 알아야한다. 하지만 나도 어릴때부터 컴퓨터를 공부했지만, 아무것도 모르는 노베이스 상태에서 컴퓨터 전문가들이 하는 클래스니 객체니, VO니 DAO니 MVC니 이런 개념들 글로만 읽어봤자 아무소용이 없었다. 귀에 하나도 안들어오다가 결국 이해하게된 시점은 내가 직점 해보고 만들어보면서다. 작은 기능단위의 개념을 이해하면서 점차 넓혀 나가는 방식이 프로그래밍을 이해하는데 좋다.
나는 비전공자들도 웹 서비스를 이해할 수 있는 것이 목적이기 때문에 MVC니 이런 큰 개념보다는 당장 눈에 보이는 것들 위주로 설명을 할 예정이다. 나도 처음 프로젝트를 생성했을때 아니 빈 깡통 만들었는데 무슨 파일이 이렇게 많고... 한파일에 수백, 수천줄이 이미 코딩되어있고.. 이 것들이 다 뭘 의미하는지 몰라서 자괴감을 느꼈었다. 하지만 이번부턴 그런거 느낄 시간도 없이 빠르게 진행해보자.
Look! 봐라 일단 좌측 프로젝트 익스플로어 창에 내 프로젝트를 보자. 이미 호기심 많은 분들은 이것저것 디렉토리를 눌러보며 수많은 파일을 보며 한숨을 쉬엇테지만. 저것들 다 나중에 알아도 되는 것들이다. 이미 날고 기는 개발자들이 수많은 고민을 거쳐 만들어 놓은 파일이니. 우리가 뭐 이건 어떻고 저건 어떻고 할 시간조차 필요가 없다. 그분들을 믿고 우린 우리할껄 하자.
자 아무것도 만지지말고 1번 폴더를 눌러서 그 하위 폴더를 다 펼쳐주자. 다만 저 사진에나온 cmm 폴더는 열어볼 필요 없다. 왜냐? cmm이 common 즉 "공통"의 약어이다. 저기 폴더는 우리 프로젝트에서 공통적으로 쓰이는 기능들을 구현해 놓은 이다. 공통 기능..! 자 이름만 들어도 살짝 만들기 어려운게 느껴지지 않나..? 지금 우린 한개기능 만드는것도 힘든데 서비스 전체에서 작동시킬 공통적인 기능들을 집대성한 공통기능..! 맞다. 이것도 위 문단에서 말했다시피 잘하시는 분들이 다 구현해 놓았다 ^-^ 열어보지도 말고 그냥 일단 넘어가자
궁금한 사람들을 위해 간단하게 설명해주자면 프로젝트에 있는 모든 컨트롤러에 전역으로 적용되는 initBind를 정의하거나, 예외상황이 생겼을때 어떻게 할지를 전역으로 설정하거나, 게시판같이 페이지를 넘어가는 기능등 cmm 즉 공통기능답게 서비스 "전체"에 적용되는 부분을 관장한다. 여긴 몰라도 된다. 나중에 코드를 볼 줄 알면 쓱 읽으면 알게 되니까!
자 이제 겁먹지 말라고 3개 문단에 나눠서 말했으니 이제 본격적으로 예제를 분석해보자. 2번 박스에 있는 EgovSampleController.java를 보자!
Camel 표기법
자 일단 대소문자가 섞여잇는데 대문자가 나올때마다 띄어쓰기라고 생각하면 된다. Egov Sample Controller.java 라고 생각하면된다. 파일명이나 변수명에 띄어쓰기가 안되는데, 그냥 소문자로만 이어쓰면 Egovsamplecontroller.java 로..사실 단어 단위로 구분해낼 수가없어 암호문이 되버린다. 그래서 띄어쓰기를 표현하기위해 띄어쓰기마다 첫글자를 대문자로 작성한다. 이 표기법을 낙타 등에 혹처럼 들어갔다 나왔다 반복한다해서 Camel 표기법이라도 한다.
EgovSampleController.java
자 일단 읽어보자. Egov는 이거 전자정부프레임워크의 앞글자를 딴거고 Sample은 우리가 만든 샘플 예제정도 되는거 같고. Controller..! 대박 Cmm 패키지 폴더에는 어려운 글자들만 보이다가 여기와보니 컨트롤러라는 아는 단어가 있다! 살짝 자신감이 생긴다. 컨트롤러..? 뭔가 조작을 하는가보네..?
속한 패키지 디렉토리 이름부터 봐라. web이다.. 맞다 여기가 제일 중심이다. 뭔가 처리해주고 판단해주고 두뇌같은 역할을 한다. 이 간단한 프로젝트에 사용자들이 요청하는 기능들에 대해서 어떻게 수행하면 되는지가 요기 정의된다.
앞으로 사용자가 요청이 들어왔을때 그 요청을 어떻게 처리하라!! 라고 정의하는 곳을 Controller라고 부를 것이다. 여기서 Controller에대한 개념을 조금 알고 가길 바란다.
컨트롤러(Controller)란 무엇인가.
컨트롤러는 하나만 있는건 아니고 큰 기능 단위로 있다. 우린 예제 프로젝트라 걍 뭐..걍 컨트롤러라고 부르기 간지가 안나니까 Sample이라고 이름이라도 붙혀서 뭔가.. 아..컴퓨터는 Sample이란 단어 잘 안쓰는데 ㅎㅎ... 이거 사람이 만든거구나.. 인간적인 냄새라도 나라고해서 EgovSampleController지만 실제 스프링 프로젝트들을 보면 위와 같이 킨 기능 단위로 컨트롤러를 만든다.
예약 조회, 삽입, 삭제, 수정 등 예약에 관한 모든것은 예약 Controller가 관리하고 그 파일에 다 명시를 하는거다. (물론 한글명으로 Controller를 만들지는 않고 뭐 RsmController.java 정도로 만든다). 또 고객에 대한 모든 기능은 고객 Controller에 담아둔다. 자이제 Controller에 대한 개념은 잡혔을 것이다. 말 그대로 기능이 어떻게 작동할지 조작을 제어하는 곳 정도로 생각하면 된다.
그럼 service에 있는 애들은 머야 ㅡㅡ 서비스..? 뭔가 코딩이 아니어도 현실세계에서 서비스라고 하면 뭔가 보이지 않는 무엇을 해주는..? 이정도로 알고있을텐데 맞다 . 여기 서비스에 있는 파일들은 저기 web 패키지에 Controller가 일 할 수 있도록 도와주는 쩌리들이 모여있다. 많이 드러나지는 않아서 활약이 크게는 안느껴지는 친구들이다. 바로 서비스부터 들어가면 어려우니까 Controller의 코드부터 분석해보자!
1. 자 package 머시기라고 써져있다. 여기 볼꺼없다. 그냥 이 파일이 속해있는 패키디 디렉토리 경로라고 보면 된다. 우측 패키지 익스플로어를 보면 저 경로에 파일이 위치해 있는 것을 알 수 있다. 민증 깠을때 내 집주소가 찍혀있듯이, 저 맨위에 이파일의 주속다 찍혀있는 것이다. 그렇다. package는 코딩계의 민증이라고 보면 된다. 자. 첫 번째줄은 큰 어려움 없이 통과했다. 히힣..
2. import라고 써져있다. 와우! 짧다.! 하지만 좌측 +버튼을 눌러보자. 와우. x 됐다. import는 컴퓨터 좀 깔짝거리면서 프로그램 몇개 만져보면 많이 봐왔어서 익숙한데.. 밑에보니 무슨 Pagination, fdl, prt, VO..갑자기 어려운게 생겨버렸다.
겁먹을거 없다. 처음부터 차근차근 이해해보자. 자 우리가 제일 자신있는 단어 import!! 맞다. 뭔가 넣어주는 거다 우리의 이 컨트롤러에(EgovSampleController.java). 근데 뭘 넣냐구..? 기능에 필요한 파일들을 넣어주는 것이다. 다시 또 묻는다. 아니 그니깐..! 뭘..! 왜 넣냐구! 한다면.. 뭐 더이상 할말이 없다.. 왜냐면.. 진짜 기능에 필요한걸 넣어주는거니까.. 하지만 나는 raw한 표현을 잘 하니 노베이스 기준으로 또 설명을 해보겠다.
자.. 우리가 기능을 만들면서 숫자를 반올림하고 반내림 하는 기능이 필요하다고 가정해보자. 자 1.9를 반올림 하라하면 어떻게 할 것인가. 우린 인간이니까 그냥 딱 바로 2잖아! 하지만 컴퓨터는 그런걸 모른다. 어떻게 구현할 것인가. 반올림을 하는 인간의 사고를 그대로 컴퓨터가 이해할 수 있도록 시간을 들여 번역을 할 것인가..? 아니다. 그럴 필요가 없다.
애초에 첫 포스팅부터 썻던 프레임워크가 뭔지 이해햐면된다. 우리가 프로젝트를 쉽고 빠르게 만들 수 있게 만드는 툴! 맞다. 우리가 원하는 고차원적인 예를들어 고객을 조회해 포인트를 차감하는 이런 구체적인 기능단위는 대부분의 사람들의 프로젝트에는 사용하지 않는기능이지만, 저 반올림이라는 아주 원초적인 기능은 대부분의 프로젝트에서 요구되는 기능일 것이다. 아주 기초적인 것이니까. 프레임워크란 이런 기초적인 기능들을 모아놓고 빠르게 조합해서 쓰라는 것이다.
즉, 저렇게 많이쓰는 함수들은 이미 이 전자정부프레임워크라는 작업대에 다 포함되어 있는 것이고. 저 import 뒤에 나오는 경로는 그 경로에 있는 파일에 있는 기능들을 여기서도 사용하겠다!의 이미라고 보면된다.
이미 import된 친구들은 이 서비스를 돌리기위해 이미 추가되어있는 것이니 손댈꺼 없다. 아~ 그냥 이 컨트롤러를 돌리는데 이런친구들을 활용하는구나~ 생각하면 된다. 다음으로 넘어가자
주석
와우 씌엣..! x 됐다..! 코딩도 아닌 그냥 평문이 써져있잖아..! 20세기 코딩법인가..? 아니면 22세기 코딩법인가..? 아니다 놀라지 않아도 된다. 저건 주석이라고 한다. 뭐냐면 코드 중간중간 이코드가 무엇인지 써놓는 낙서장 같은 역할이다. 사용하는법은 이렇다 코드에 // 을 붙이면 그 뒷줄은 컴퓨터가 인식하지 못한다. 하지만 100줄을 주석처리할려면 //을 100번을 쳐야할까..? 아니다 그 그 100줄을 앞뒤로 /** 내용 ㅎㅎ **/로 감싸면 그 사이를 모두 인식 못하게 된다.
저 주석을보면 저 코드가 2009년에 수정되었나보다... 아니 2019년 오타아냐?ㅡㅡ 할 수 있지만.. 2009년이면 양호한거다.. 어떤코드를 보면 2003년 주석도있고.. 그 당시 개발자의 욕..애환들도 써져있기도 하다.. 아..이거 왜 안돼.. 집에 언제가.. . 이런게 써져있는걸 처음 봤을때 잘못본줄 알았던게 생각난다..ㅋㅋ 마치 디지털 동굴 벽화를 본 느낌.. 저 주석은 읽고 이해되면 그런가보다하고 이해못하면 걍 넘어가자 ㅎㅎ
1. 자 @가 붙어있다. Annotaion(어노테이션)이라고 하는데 앞으로 이 골뱅이의 의미는 "얜! 이런 성격을 가지고 있어!"라고 알려주는 거다. 즉, 이 데이터가 어떤 데이터인지 설명해주는 데이터라고 보면된다. @뒤에 Controller라고 써져 있으니. 미 밑줄 public class EgovSampleController 라는 친구는 "Controller"라는 친구야!! 라고 설명을 해주는 것이다. 이건 컴퓨터가 소스코드를 읽어올때 먼저 어노테이션부터 읽어놓고 이놈에 필요한 정보들을 미리 준비한다. 그럼 또 Controller라고? 그게 먼데? 라고 또 묻는다면 위를 다시 읽어보면 된다. 내가 계속 말한 컨트롤러에 대한 설명을 저 @Controller 라는 한줄로 컴퓨터는 아하!!! 하고 알아듣는다.
2. public class EgovSampleController 이부분을 보자. 이건 java에대한 기본 지식이 있으면 저 public calss의 의미는 알것이고 비전공자분들은 저거 크게 신경 안써도 된다. 학교에서 시험볼때나 저거만지지 스프링 프로젝트 하다보면 거의 만지는일은 없다.. EgovSampleController는 이 컨트롤러의 이름이다. 이건 좌측 패키지 익스플로어에 나오는 파일명과 일치해야한다. 자 2번까지도 별거 없다. 3번으로 가자
3. 자 이제 좀 코드다운게 나왔다. 쫄지말자 일단 첫줄 /** EgovSampleService **/ 이건 위에 말했다시피 주석이다. 밑에있는 내용이 EgovSampleService라는 친구에요 ^-^하고 알려주는 것이다. 자그럼 두번째줄 @Resource(name = "sampleService") 어..! 이거 살짝은 알아 들을 수 있을꺼 같은데..!? 그렇다 @Resource가 붙어있으니 아래 나오는 private EgovSampleService는 Resource라는 형태로 되어있는놈이다!! 이렇게 해석하면된다. 저기 name = "sampleSerivce"라고 되어있는데 짐작이 가지 않는가..? 맞다 그 Resource의 이름은 sampleService라는 놈이고 그놈이랑 연결을 시킨다라는 의미다.
좀 더 나아가자면 웹 서비스가 처음 구동될때 생성된 POJO라고 불리는 함수나 상속, 구현이 없이 순수히 데이터만 가진 객체를 생성하는데 물론 그 데이터마다 name이 있다. 그 당시 만들어진것을 지금 저 Controller가 지금 매칭을 시키는 것이다. 시작하면서 만들었던 그 객체!! 우리가 지금 써야해!! 하고 Resource 어노테이션을 이용해서 연결시키는 것이다.
다음줄을 보면 private EgovSampleService sampleService라고 되어있다. 자 이건 자료의 형이 EgovSampleService이면서 여기서 사용할 이름은 sampleService라고 선언하는 것이다. 물론 이 객체는 위에 Resource 어노테이션을 이용해 연결된 smapleService라는 객체의 데이터를 받았다고 생각하면 된다.
서비스(Service)란 무엇인가
자.. 위에서 본 3번 박스.. 요약하자면 지금 sample이란 이름의 service를 데리고 온거나! 컨트롤러에! 그게 뭐냐면 앞으로 컨트롤러 내부에서 sample에서 정의된 모든 기능들을 쓸 수 있다는 얘기!! 자.. 여기서 뭔 소린가 멘탈나간 사람들을 위해서 그림으로 정리해봤다.
자 .. 이상하긴 하겠지만 군대에 이걸 대입해보자. 자 컨트롤러란 공통된 기능들의 집합인데 이걸 군대로 치면 통신부대, 전차부대, 포병부대, 공병부대 이렇게 각 역할들로 묶인 집단으로 생각할 수 있다. 사용자들이 웹 페이지에 요청을 어떻게 처리할지 Controller에 정의하듯이, 통신부대도 상급부대에서 명령이 내려오면 어떻게 할지는 통신부대 내부에서 처리한다.
자! 다시 부대얘기로 돌아와서 사령부에서 "지금 A~B구간의 통신망 개통이 가능하니?" 라는 요청을 한다면 이 통신부대에서는 요청을 처리해야할 것 아닌가? 그럼 요청은 어떻게 처리할까? 그냥 부대원들 모여서 야 ㅎㅎ 개통 가능할까..? ㅎㅎ 투표할까..? 아님 발표하고싶은사람있어..? ㅎㅎ 이렇게 오합지졸로 결론을 도출할까? 아니다.
그 통신부대에는 운용과장이 전술,전략에대해 판단하고, 군수과장은 출동에 가용한 차량은 몇대나 되는지, 식수는 몇명인지 등 각 역할별로 본인들의 "기능"들이 있을 것이다.
더 세부적으로 들어가면 운용과장은 1. 지형을 판단하여 통신망 개통이 가능한지의 판단. 2. 적의 예상 침투로를 판단, 3. 지형과 기상을 판단 등 여러가지 판단을 내릴 수 있고 이건 인사과장이나 군수과장의 임무가 아니고 운용과장만이 주로 해야하는 일종의 기능들인 것이다.
이제 좀 감이 잡혔는지 모르겠다. 즉 서비스라는 것은 특정 기능들을 하기위해 필요한 객체들을 불러와 놓은것이다. 서비스 이름이 SampleService라고 해놔서 샘플 기능을해..? ㅡㅡ 라고 좀 이해가 안된다 생각할 수도 있지만.. 머 마땅히 붙힐 이름이 없어서 저렇게 붙혔을 것이다.. 샘플 프로젝트라 머..아무 기능이 없는데 뭔서비스라고 지어 ㅡㅡ 라고 생각해서 아마 그냥 프로젝트의 이름을 따와서 SampleService라고 지어놨을 것이다.
자 그럼 어떤 서비스들을 꺼내놨는지 보자.
1. sampleService란다. 이건 우리가 예제로 만들어져 있는 서비스다. 그 상세 기능은 저 파일안에 정의되어 이씅며 저 서비스가 하는내용으론 게시판의 글을 조회하고, 수정하고, 목록을 가져오는 아주 범생이같은 일을 처리해주는 서비스다.
2. propertiesService는 파일에 찾아봐도 없을 것이다. 바로 이건 살짝 깊숙한 곳에서 불러왔기 때문이다. 여기에대해서 설명하면 좋은데 그럼 또 너무 길어진다. 우린 쓸일이 없으니, 분량을 위해 더이상 알아보지말고 어떤 놈인지만 알고 넘어가자. 바로 페이지의 크기가 정의되어 있다.
context-properties.xml에 정의되어 있는데 아니..!갑자기 잘나가다 왜 갑자기 이딴게 튀어나와!!! 할 수 있지만. 일단 넘어가자. 설명하면 좀 길다. 일단 이 서비스는 게시판 목록에대한 정보를 가져오는 서비스라고 생각하자.
3. 자 얘도 더욱이 알필요 없다. 말그대로 Validator 즉, 유효성을 검증해주는 친구인데 말만들어도 재미없다..그냥 시스템을 탄탄하게 해주는 놈이라고 생각하고 넘어가자.
URL Request Mapping
자 이제 쭈르륵 내려보면 저 뭉텅이의 꼴들이 계속 나올텐데 이게 가장 중요하다 사실 위에 말했던거 이해하면 좋은거고 이해못해도 상관없다. 어차피 저거다 복붙해서 이름만 바꾸고 크게 중요하지 않다 초보자 입장에서는..
이제 알아볼 것은 이제 진짜 요청을 어떻게 처리시킬지를 정의해두고 있다. 주석을 보면 함수가 어떤기능을 하는지를 정의해놨다 긍 목록을 조회하는 함수라고 한다.
1. 자 어노테이션에 RequestMapping이 붙었다. 제일 중요한 녀석이다. 사용자가 글목록을 조회할때 http://localhost:8080/egovSampleList.do 라는 URL이 요청될텐데 웹 서비스는 저 egovSampleList.do 라는 요청을 누가 처리하는지 찾아낸다. 근데 모든 함수를 전수조사하면 답이 없으니 저 RequestMapping이라는 어노테이션이 붙은 친구들중에서만 찾아낸다. 만약 저걸 처리해주는 함수를 만나면 실행시키는 것이다!
2. 그래서 함수의 이름도 요청의 이름과 동일하다
3. 글을 어떻게 불러오고 어떻게 처리할지 구체적인 비지니스적인 로직이 여기 작성된다. 일단 우린 큰틀부터 잡을 것이기 때문에 여기에 그런 것들이 적힌다는 것만 알고 넘어가자
4. "sample/egovSampleList"를 반환헀다. 결국 3번에서 처리한 결과를 반환한것이다. 이제 그 결과가 사용자가 보는 화면단에 나타날 것이다.
여기까지 알아본게 바로 뒷단 로직인것이다. 전체적으로 한번 보자. 컨트롤러는 함수이름으로 보지말고 RequestMapping 값이 어떤 URL인지 보는게 더 편하다. 사용자도 저 주소를 치고 들어가니까말이다. 아 그리고 요청 URL의 끝은 .do를 쓰는데 그냥 그런가보다 해라. do someting!! 뭔가를 수행해라!!의 의미로써 우리가 아는 do의 의미랑 같다. 이렇게 붙인 이유는 다른 Servlet과 충돌을 막기위해 아무거나 바꾸긴 해야하는데... 그냥 적당한걸로 바꿨다고...
자 정리해보자. 우리의 기본 컨트롤러인 EgovSampleController는 게시글 관련기능, 페이지 목록, 유효성을 검증해주는 3개의 서비스를 호출해놨고 이 컨트롤러에서는 글 조회, 등록화면 조회, 글 수정화면 조회, 글 수정, 삭제 등 5가지의 기능을 수행하는 컨트롤러다!
만약 사용자가 http://localhost:8080/ + 저 기능에대한 주소 를 요청하면 이 컨트롤러가 위에 정해진 로직대로 기능을 수행할 수 있다. 오늘은 여기까지 뒷단 로직의 일부를 알아보았다.
자 정리하면 딱 이거다.
1. 사용자는 크롬이던 익스플로러든 웹 화면을 보고 글을 쓰기위해 "등록" 버튼을 누른다
2. 등록 버튼이 눌리면 등록 화면을 호출해주는 URL을 호출한다.
3. 그 URL은 addSample.do 이다.
4. 스프링 서비스에서는 Servlet이란놈이 저 addSample.do요청이 들어오면 누가처리해!!!!!!!!소리를 지르다 RequestMapping 어노테이션을 뒤져보니 EgovSampleController가 해준다는 것을 알아낸다.
5. 찾아냈으니 그 요청에대한 비지니스 로직을 실행한다
6. 결과로 sample/egovSampleRegister.jsp를 반환했다. 그럼 사용자한테 이 화면을 보여주면 되는거다!
7. WAS가 5번에서 넘어온 정보들을 sample/egovSampleRegister.jsp에 뿌려 조립을해서 그 결과를 사용자에게 보여준다!!!!!!!!!!!
하!!!!!!!!! 이거 포스팅 작성하는데 한 4시간 걸린 것같다...일단 큰 개념을 잡았으니, 다음시간에..간단한 요청처리를 하나 만들어보자..ㅠㅠ 힘드러
#스프링 #Spring #전자정부프레임워크 #기본구조 #샘플예제 #예제 #프로젝트 #분석 #원리 #컨트롤러 #Controller #서비스 #Service