21.04.07

민주·2021년 4월 7일

[Properties]

- Spring 에서는 주요 정보를 properties 파일에 저장해 놓거나 불러와서 사용 한다.
- Xml 이나 properties 는 정보를 컴파일 하지 않기 때문에 쉽게 읽고 수정이 가능 하다.
- 하지만 보안 성 측면에서는 위험할 수 있다.
- 많은 설정이 들어갈때 유용하다.
1. 첫 설정 이후 web.xml의 context-param과 servlet을 변경해준다

<!-- 서버가 켜질때 읽음, spring 아래 root라는 폴더를 만들고 -context라는 파일은 다읽게 변경 -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root/*-context.xml</param-value>
</context-param>
    
<!-- 첫 요청이 들어왔을때 읽음, -context라는 파일은 다읽게 변경 -->
<servlet>
	<servlet-name>appServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/appServlet/*-context.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

2. src/main/resources에 props파일을 만들고 아래 확장자가 properties인 파일추가
- key=value로 구성

[props/globals.properties]
Globals.DriverClassName=net.sf.log4jdbc.DriverSpy
Globals.Url=jdbc:log4jdbc:oracle:thin:@gdportal.iptime.org:1521:xe
Globals.Username=C##TEAM4_MM
Globals.Password=pass

[admin.properties]
admin.id=superAdmin
admin.pw=superManager

3. root-context.xml의 namespace에서 util추가하고 아래내용 추가
<bean id="propertyConfiguer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
	<list>
	    <value>classpath:/props/*.properties</value>
	</list>
    </property>
</bean>
	
<!-- properties를 java소스 안에서 활용할 수 있도록 하는 설정 -->
<util:properties id="config" location="classpath:/props/admin.properties"/>
    
4. /WEB-INF/spring/root/ 아래 myBatis와 DB접속 설정 파일 만들어주기
- globals.properties에서 정해준 key값을 value에 넣기 value에 넣기
[datasource-context.xml]
<bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${Globals.DriverClassName}"/>
    <property name="url" value="${Globals.Url}"/>
    <property name="username" value="${Globals.Username}"/>
    <property name="password" value="${Globals.Password}"/>
</bean>

5. service에서 properties에서 정해준 값을 사용할때 아래내용을 추가해서 불러온다.
@Value("#{config['admin.id']}") String adminId;
@Value("#{config['admin.pw']}") String adminPw;

[redirect로 데이터 보내기]

- model을 사용하면 redirect라 하더라고 데이터를 보낼수 있다.
- 단, url뒤에 parameter 형태로 붙여나가기 때문에 보안상 좋지 않다.
- 보낸 데이터는 view에서 ${params.msg}형식으로 받을 수 있다.
- 이를 해결 하고자 RedirectAttributes를 사용한다.
- RedirectAttributes는 저장한 값을 session에 임시 보관 후 데이터를 전달하고 나면 빠르게 삭제한다.
[controller]
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ModelAndView login(@RequestParam HashMap<String, String> params,RedirectAttributes rAttr) {
    logger.info("로그인 : {}",params);
    return service.login(params,rAttr);
}

[service]
public ModelAndView login(HashMap<String, String> params,RedirectAttributes rAttr) {
    logger.info("로그인 요청");
    ModelAndView mav = new ModelAndView();
    String page = "redirect:/";
    String msg = "아이디와 비번을 확인해주세요";
    rAttr.addFlashAttribute("msg", msg);
    mav.setViewName(page);
    return mav;
}

[Restful Service]

- url을 보고 어떤서비스에 뭘 요청했는지 알 수 있어야함
- 하나의 서버로 다양한 플랫폼의 클라이언트 대응 가능
- 라이브러리 jackson-databind와 jackson-core 사용
- json으로 데이터를 내려줄 경우 Java 데이터타입을 json형태의 문자열로 변경 후 
  response에 직접 데이터를 넣었다.
@RequestMapping(value = "/list", method = RequestMethod.GET)
    public @ResponseBody ArrayList<String> list() {

	ArrayList<String> list = new ArrayList<String>();
	list.add("first");
	list.add("second");
	list.add("third");	
	return list;
}
- @ResponseBody를 이용하면 자바객체를 그대로 반환하여 사용가능하다.(json형태로 변환 안해줘도됨)
- 위 코드 참고
- 컨트롤러 자체에 @RestController를 붙이면 메서드 마다 @ResponseBody를 붙여주지 않아도 된다.
@RequestMapping(value = "/list", method = RequestMethod.GET)
    public ResponseEntity<ArrayList<String>> list() {
		
	ArrayList<String> list = new ArrayList<String>();
	list.add("first");
	list.add("second");
	list.add("third");
	return ResponseEntity.ok().body(list);
}
- @RestController사용시 ResponseEntity를 사용하여 반환할 수 있다.
- 특정한 서버 상태를 전달 할 수 있다.
- 반환타입이 무조건 ResponseEntity로 고정 가능(권고사항은 아님)
- 위 코드 참고
profile
개발이좋아요

0개의 댓글