병갈이 블록

회원가입 과정 구현. 본문

IT(Old)/JSP 실습 과정 기록

회원가입 과정 구현.

woojang 2017. 7. 14. 17:21

간단할거라 생각했던 작업인데 상당히 머리아픈 작업이 되어버렸다.

단순히 머리로 생각만 하면서 구현을 했더니 여기저기서 문법적 오류, 논리적 오류들이 무더기로 발생한다.


페이지에서 넘어온 파라미터를 핸들러에서 받아 서비스 및 DAO클래스에 넘길 자료형클래스를 하나만 만들었었는데...

아이디를 조회하는 과정에서 불필요한 값들까지 자료형 클래스에 담아야하는 상황이 발생한다.


아....멘붕이 왔다.

한번 적어보자.

1. DAO에서 insert문에 아이디를 조회하는 기능까지 구현을 해야하나?

2. 1번과 물려있는 문제인데 Service에서 insert메서드와 select메서드를 따로 만들어야 하나? 

그러면 굳이 DAO와 Service를 나누는 이유는 뭘까?

3. 핸들러에서 파라미터 공백시 Map변수에 에러값을 추가하도록 구현을 했었는데...뭔가 길고 정신이 없다.

그리고 패스워드관련, 조건문이 늘어가게 된다. 핸들러의 코드가 길어지기 시작한다.

4. insert에 사용하려고 했던 자료형을 select문에도 그대로 사용하려 했더니 불필요한 데이터까지 추가해서 반환을 해야한다.

5. 조인폼 페이지에서 비번을 입력안해서 한번 오류가 등록이 되었는데 이후 똑바로 입력을 해도 계속 에러문구가 출력된다.

6. db에 저장된 한글 데이터가 깨진체로 저장되었다....우와...;;;;


해결방법들..

1. DAO는 되도록 서로서로 안섞이도록 한다. 단순히 "하나의 쿼리문을 수행"하는것을 목적으로 가진 메서드로 구현한다.

2. Service에서는 DAO에서 존재하는 메서드로 필요한 기능을 구현하도록 만든다. 

가입하는 서비스 클래스라고 치면 몇가지 작업이 필요할 것이다.

1) 핸들러에서 자료를 받아온다.

2) 받아온 자료중 id를 가지고 동일한 id가 존재하는지 확인을 한다. (DAO의 select메서드)

3) id가 없다고 별다른 문제점이 없다면 받은 자료를 DB에 넣는다. (DAO의 insert메서드)

즉, DAO는 필요한 별개의 매서드를 따로 구현해놓는곳. 

Service는 DAO에서 필요한 메서드를 사용해서 필요한 기능을 구현하는곳이다. 실직적으로 DB와 가까운 클래스이다.

3. 이것또한 역할의 구분을 분명히 하지 않았던 것으로 인한 결과인것 같다.

에러유무는 자료형클래스와 관련이 컸기 때문에 자료형 클래스에 Map변수를 매개변수로하는 

별도의 public메서드를 구현했어도 됐다. 그러면 핸들러클래스의 그 길던 코드는 한줄로 줄어버린다.

이것도 역할의 구분과 분명 관련이 있다고 본다.

핸들러는 자료를 받아 데러 유무에 따라 서비스메서드를 호출하던지 폼으로 돌려보내던지만 하면 되는데...

역할의 구분. 하나의 단위나 묶음이 가능한 코드라면, 별도의 메서드로 만들어서 본체의 코드를 간결하게 할 필요가 있다.

4. 충분히 구상하고 고민하지 않았던 결과인것 같다.

insert에 사용되는 자료형클래스와 select에 사용되는 자료형 클래스를 별도로 둠으로써 해결이 된 문제.

에초에 두 경우가 필요한 데이터가 다르다. insert문 같은 경우 DB에서 요구하는 데이터를 모두 넣어야하고,

select문 같은 경우 id조회 및 세션으로만 사용할 거라 id와 name만 있으면 된다.

상황에 따라서 필요한 데이터가 어떠한 것이 있는지 구상하는 단계에서 잘 나누고 구별했어야 했다.

그리고 하나의 자료형으로 해결이 안되면 새로운걸 만드는 것도 마다하지 않아야 한다.

5. 핸들러 클래스의 전역변수로 Map을 뒀더니 메서드는가 새로 실행됨과 상관없이 값이 계속 누적되어 일어난 현상이다.

메서드 내에서만 사용하도록 메서드 내에 Map변수를 생성함으로 문제 해결.

6. 파라미터를 받아 데이터를 사용할때 무엇을 하라고 했었던가? 

req.setCharacterEncoding("utf-8");

이걸 꼭 하라고 하지 않았던가? .....

그냥 서블릿과 핸들러에 두 코드를 추가하려고 했었으나....filter가 생각났다.

그리고 필터를 다시 연습 해 볼겸 해본다.

중요한것...Filter 인터페이스를 구현한다.

Filter인터페이스에는

doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException

init(FilterConfig conf) throws ServletException

destroy()

메서드가 있다.

init에서는 conf객체로 getInitParameter를 사용하여 web.xml에 지정한 initparam을 가져올 수 있다.

doFilter는 req, res를 가공하여 chain.doFilter()메서드의 매개변수로 전달한다. (여기서 setCharacterEncoding을 적용해준다.)

그러면 모든 페이지가 여기 필터를 거치면서 캐릭터셋이 적용된체로 값들이 전달되어 값이 안깨진다.


끝. 오키. 이제 오늘을 토대로 내일도 화이팅!!!

Comments