본문 바로가기
소소한 지식모음

회사다니면서 새로 알게된 잡지식_01

by 작심평생 2019. 6. 2.
DefaultVO
: 공통적으로 쓰이는 부분 (검색, 페이징..etc)
: 다른 VO 생성 시 DefaultVO를 상속받아서 하는 식.
: 전자정부프레임워크를 이용한 프로젝트를 만들 때 제공.
 

 
 Mybatis를 이용할 때 XML에 쿼리문을 쓰는데 이때 태그 값으로 쓰는 resultType은 결과 값으로 어떤 타입이 return 되는 지 알려주는 것(-> select문 빼고 다른 DML에선 필요없음)
 이 때 sql-mapper-config에 설정해줘야함. 이것 역시 egove를 쓰면 만들어 주는 듯 하다...
 
ex) VO는 다 연결해서 쓰자.
 
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
     <typeAliases>
     <typeAlias  alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>
     <typeAlias  alias="FileVO" type="egovframework.com.cmm.service.FileVO"/>
     <typeAlias  alias="ComDefaultCodeVO" type="egovframework.com.cmm.ComDefaultCodeVO"/>
   </typeAliases>
</configuration>
 
- settings 태그 : mapUnderscoreToCamelCase('zxcTnma'이런 표현법)를 적용한다는 것. 당연하지만, 쿼리문이 있는 XML의
  DB 컬럼값은 VO에 선언된 변수와 형식 통일시켜야함. 그리고 이 표기법은 '_' 다음에 대문자 이후에 소문자 형식
  ex) USER_PW면 VO에는 userPw 이렇게 선언해놔야 한다는 것.
 
- typeAlias 태그 : alias는 별명. 쿼리문XML에서 resultType에 쓰임. ModelAttribute같은 느낌이라 생각하자. type은 경로.
 
==> 만약, 이렇게 연결해놓지 않고 resultType에 작성하면 에러. 그리고 이렇게 연결했기 때문에 {param1} 대신 VO에 선언된 필드값으로 사용가능( ex. {userPw} )

쿼리문 있는 XML에서 <if>, <choose>, <when> 등등 쓸 수 있고 <![CDATA[>=]]> 되어있는 모습도 볼 수 있음
이건, 비교연산자 인식하게 만드는 방법. 
 
${}, #{} 의 차이 
: 전자는 실행 시 타입을 맞춰줌. #{}는 '' 필요한 경우 사용. ex) #{0} => '0'
  주로 #{}을 많이 쓰고 있다


 
@RequestMapping(value={}) => 여러개 받을 수 있음.

ex) @RequestMapping(value={"/temp/main", "/temp/sub1", "/temp/sub2"}) 
 
------------------------------------------------------------------------------------------
 
게시판 Service 패키지 : 인터페이스, 필요한 DTO로 구성
게시판 Service 구현 패키지 : 실제 구현 부분(=> @Service("사용할이름")으로 객체 등록, DAO(=> @Repository("사용할이름")으로 객체 등록)
                              실제 구현 부분에서 @Resource("설정한 이름")로 DAO를 DI하고 DAO에 구현된 메소드 실행.
                               DAO부분은 egov에서 제공하는 SQL 메소드 구현. EgovComAbstractDAO 상속받아서 구현

++추가
: 사실 프로젝트마다 구성을 어떻게 하냐에 따라 다르게 구성한다...
: 어노테이션 쓸 때 어차피 Bean을 생성시키는 이유로 아무거나 갖다 썼는데 이번 기회에 구분해서 쓰는 습관을 들여야겠다. (어떤 의도로 Bean을 생성한 건지 알기도 쉽고!)

 

 
codeVO
: 공통 부분을 관리하는 것.네이밍은 신경쓰지 말자. 예를 들어 검색 조건을 제목, 내용.. 회원가입할 때 010, 032 등등 이런 것들이 한번만
 쓰이는게 아니라 여러번 쓰일 것같으면 이렇게 관리해주는 것. 이는 유지보수 요청왔을 때 쉽게하기 위한 것!
 
   ex) 010,011,016 등이 있을 때 "016 빼주세요" 하면 codeVO를 이용해 특정 코드 안에 리스트로 있는 016 이란 값을
       제거해주면 됨.
 

 
리스트 조회 시 @SuppressWarnings("unchecked")...?

    @Override - 메소드가 오버라이드 됐는지 검증합니다. 만약 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류가 납니다.
    @Deprecated - 메소드를 사용하지 말도록 유도합니다. 만약 사용한다면 컴파일 경고를 일으킵니다.
    @SuppressWarnings - 컴파일 경고를 무시하도록 합니다.
    @SafeVarargs - 제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시합니다. (자바7 이상)
    @FunctionalInterface - 람다 함수등을 위한 인터페이스를 지정합니다. 메소드가 없거나 두개 이상 되면 컴파일 오류가 납니다. (자바 8이상)

사실 이렇게 나와있지만, 경고를 무시하는 어노태이션이라 함부러 쓰기도 그렇고
아직 정확한 사용법? 사용시기? 를 모르겠다...
 

 
컨트롤러 부분 ..인증된 사용자 체크 하는 이유? 
--> 기본적으로 인터셉터를 써도 되지만 플젝 때 마다 구현하는 건 시간낭비
     그리고 그게 오류가 없을 것이라 단정할 수 없음. 대신 egov에서 제공하는
     EgovUserDetailsHelper.isAuthenticated(); 서비스를 이용하는 것. 안정성도
     있고..! 구현 방식의 차이임.

다만 egov에서 구현하는 방식이 어떻게 돌아가는지 원리는 알아야 할 것 같다..! 하다못해 흐름이라도
 


AJAX로 주고받고 하기 위해서 @ResponseBody는 필수!

ex) @Controller를 사용하는 경우 
    @RequestMapping(value="/community/updateReadCnt.do",produces = "application/json; charset=utf8")
    @ResponseBody

단, @RestController를 사용하면 @ResponseBody를 사용하지 않아도 됨. (아직 써본적은 없음)
@RestController는 리턴값에 자동으로 @ResponseBody가 붙어 HTTP 응답데이터(body)에 자바 객체가 매핑되어 전달 된다고 함

참고 : https://lee-mandu.tistory.com/242
 


크로스 사이트 스크립트 공격 (XSS : Cross-site Scripting Attacks)
사이트에 스크립트 코드를 삽입하는 공격기법 => 쿠키와 세션정보 탈취, 악성코드 유포 가능

방어법
  • 사용자 입력이 필요할 경우 클라이언트 단에서 유효성 검사를 하는 방법
  • 서버 단에서 데이터 유효성 검사를 하는 방법
  • innerHTML 속성이 아닌 textContent 속성을 이용하여 마크업이 아닌 이스케이프로 처리된 텍스트로 코드를 처리할 것
            jquey에서는 html()함수가 아닌 text()함수를 사용

이스케이프로 처리된 텍스트란 다음을 의미

&    =>  &amp;
'      =>  &#x27;
"     =>  &quot;
<    =>  &lt;
>    =>  &gt;
/     =>  &#x2F;


CrossSiteScriptInterceptor 클래스(interceptor 상속)
: XSS 공격 방지를 위해. 검색 시 <>를 사용해서 검색해야하는 경우도 생김. 하지만 <script> ~ </script> 식으로 입력하면
  해당 결과를 보여줄 때 소스코드에 해당하는 반응이 생겨버림(alert하면 alert 팝업이 뜨고 그럼;) 이런 것 방지.
 
ex)
    param.indexOf("javascript") > -1
    || param.indexOf("script") > -1 
    || param.indexOf("iframe") > -1 
    || param.indexOf("document") > -1 
    || param.indexOf("vbscript") > -1 
    || param.indexOf("applet") > -1 
 
이렇게 있는데 <>안에 들어가는 경우 문제가 생기는 문자열을 처리해서 XSS 방지하는 것. indexOf == 0 이면 있다는 것..
 
해당 문자열을 못쓰게 막는다!는 방법은 이렇게 할 수도 있고 XML에서 설정할 수도 있음. 다양. 아니면 '<'를 다른 문자열로 처리해
DB에 넣고 이를 다시 꺼낼 때 replace해서 '<'로 만들 수도 있음.
 
참고
 : https://victorydntmd.tistory.com/83
 

 
글 작성시 미리보기 하는 소스(URLDecoder.decode를 왜 하는지?)
 
ex) String title = URLDecoder.decode(request.getParameter("title2"),"utf-8");
--> 상황에 따라 다르지만, 해당 프로젝트의 부분에서는 DB의 charset과 웹상의 charset이 다를 수 있기 때문에 해준 것 같다고 함.
 

'소소한 지식모음' 카테고리의 다른 글

return false, NVL, where 1=1, 커스텀태그  (0) 2019.12.02
[생활코딩] AJAX  (0) 2019.06.02
[펌] SiteMesh 이용  (0) 2019.06.02
회사다니면서 새로 알게된 잡지식_02  (0) 2019.06.02
UUID - 범용고유식별자  (0) 2019.06.02

댓글