구매후기 이미지 업로드에서 오류가 나고 있어서 해당 내용을 검토 중에 알게 된 내용을 정리합니다.

기본적으로 아래와 같은 방식으로 업로드가 되고 있습니다.


브라우저 -> php -> Java


그런데 문제는 어느 한쪽의 문제가 아니라 php, Java 둘다 문제가 발생...

그리고 문제의 원인은 둘다 Version Up이였습니다.


1. 먼저 Java

Error Message가 "Required MultipartFile parameter 'file' is not present" 라고 발생.

구글링 하니 http://stackoverflow.com/questions/25830503/spring-mvc-http-status-400-required-multipartfile-parameter-file-is-not-pre 가 검색 됨.


아래와 같은 방식으로 수정


AS-IS : <bean id="multipartResolver" class="**org.springframework.web.multipart.commons.CommonsMultipartResolver**" />

TO-BE : <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />


2. 다음으로 PHP


PHP에서 Java 쪽으로 파일을 올릴 때는 CURL을 사용했는데 기존에 /tmp에 올라온 임시 파일을 읽어 들일 때는 @를 사용해서 리소스를 읽어 들였음.

php 5.5.0 기준 Deprecated 된 기능이라서 다른 방법으로 수정



저작자 표시 비영리 변경 금지
신고

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

Spring Batch를 그닦 많이 써본 경험이 없지만, 특정 요구 사항이 있어서 개발하게 되었습니다.

작업을 하면서 겪은 오류를 어떻게 해결 했는지 History 및 Backup을 위해 적어 둡니다.


보통 배치는 Reader와 Writer로 구분합니다.

특정 정보를 Reader에서 읽어 들여서 필요한 내용을 가공하고 Writer에서 필요한 행동을 합니다.


그런데 Reader에서 정보를 읽어 들이고 가공하는 시간이 오래 걸리면서 Writer에서 DB Connection을 못 찾게 되고, Writer 작업을 수행하지 못하게 되는 경우가 발생했습니다.


구글링을 한 결과 "autoReconnect 값을 true로 해라", "validationQuery를 날려라" 등등이 나왔지만 유효하지 않은 해결책이였습니다.


결국 찾아낸 해결 방법은 applicationContext.xml에서 database 관련 다음의 옵션을 수정하는 거였습니다.


testOnBorrow : true


이 옵션은 커넥션 풀에서 커넥션을 가져올 경우 유효한지 검사하는 것인데

일반적인 웹서비스에서는 커넥션이 자주 맺고 끊어져서 이 옵션과 상관없이 잘 동작 하는데

배치와 같이 특별한 경우에는 기존 커넥션을 사용하려다가 연결 해제된 커넥션을 검증 안하고 쓰면서 발생한 문제였습니다.

즉 testOnBorrow가 false인 경우에는 유효하지 않은 커넥션을 사용할 수 있으므로, Writer에서 에러가 종종 발생하게 된 것입니다.


저작자 표시 비영리 변경 금지
신고

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

다국어 사용을 위해서 그동안 Struts2 기반 MessageUtil만 사용하다가 Spring 기반으로 변경하기 위해 구글링, 작업한 내용을 정리 차원에서 올립니다.


1. applicationContext.xml에 다음 내용을 추가


<!-- for MessageUtil -->

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

        <property name="basenames">

            <list>

                <value>/WEB-INF/messages/messages</value>

            </list>

        </property>

        <property name="cacheSeconds" value="100000" />

        <property name="defaultEncoding" value="UTF-8" />

    </bean>

    <bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">

        <constructor-arg ref="messageSource"/>

    </bean>

    <bean id="messageUtil" class="package.path.MessageUtil">

        <property name="messageSourceAccessor" ref="messageSourceAccessor"/>

    </bean>


2. MessageUtil




참고 사이트

http://springsource.tistory.com/113

http://blog.naver.com/pureb612b/10120505318

http://zinlee.tistory.com/204

저작자 표시 비영리 변경 금지
신고

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

출처 : http://warmz.tistory.com/727


1. HttpServletRequest, HttpServletResponse


2. HttpSession


3. Local

 - java.util.Locale 지역 정보


4. InputStream, Reader

 - HttpServletRequest의 getInputStream(), Reader


5. OutputStream, Writer

 - HttpServletResponse의 getOutputStream(), Writer - 서블릿 형태로 만들때 사용한다.


6. @PathVariable

 - @RequestMapping의 URL {} 부분의 패스 변수를 받는다.

    만약 타입이 틀린 값이 들어오면 HTTP 400 - Bad Request 가 전달 된다.

1
2
@RequestMapping("/board/{id}")
public void view( @PathVariable("id") int id ) {...}
 

7. @RequestParam

 - 스프링 내장 변환기가 다룰 수 있는 모든 타입을 지원한다.

   해당 파라미터가 없다면 HTTP 400 - Bad Request 가 전달 된다.

 -  file의 경우는 <input type="file" name="file" /> 에 매핑 된다.

1
2
3
public String edit( @RequestParam("id") int id,
            @RequestParam("title") String title,
            @RequestParam("file") MultipartFile file ) {...}
 

 -  맵 형태로 받으면 모든 파라미터 이름은 맵의 키에 파라미터 값은 맵의 값에 담긴다. 

1
public String add( @RequestParam Map<String, String> params ) {...}

-  파라미터가 필수가 아니라면 required = false 로 지정하면 된다. 

   이때 파라미터가 없으면 NULL이 들어간다. default 값을 지정 할 수도 있다. 

1
2
3
public void view( @RequestParam(value = "id",
                        required = false,
                        defaultValue = "0" int id) {..}.
 

8. @CookieValue

 - @RequestParam과 동일 하며 쿠키값을 가져올 때 사용한다.

1
2
public String check( @CookieValue("check") String check,
                required = false, defaultValue = "" ) {...}
 

9. @RequestHeader

 - 헤더 정보를 메소드 파라미터에 넣어 준다. Ajax로 처리할때 $.ajax(...) 에서 head에 특정 값을 넣고 여기서 받아서 

   있으면 ajax이고 없으면 일반페이지라는 식으로 이용하면 된다.

1
public String header( @RrequestHeader("ajax") String ajax ) {...}
 

10. Map, Model, ModelMap

 - view를 String으로 리턴해 주고 Attribute를 Map, Model, ModelMap 에 담을 수 있다.

 

11. @ModelAttribute

 - 파라미터를 Object형태로 받을때 사용된다. 일반적인 파라미터 형태로 쓰인 경우 타입이 일치하지 않으면 객체에 매핑 되지 

   않으며 에러는 발생 시키지 않는다. 자동으로 ModelMap에 담기므로 modelMap.addAttribute를 해 줄 필요가 없다.

1
public void update( @ModelAttribute("board") Board board) {...}

 - 메소드에도 @ModelAttribute를 설정 할 수 있다. 리턴값이 항상 나머지 컨트롤러에 자동 추가 되며 보통 참조용 데이터 등에 

   이용된다.

1
2
@ModelAttribute("emailList")
public Map<String, String> getEmailList() { ... }
 

12. Errors, BindingResult

  - 모델의 값을 검정한다. 이때 BindingResult나 Errors의 파라미터 값의 위치는 반드시 @ModelAttribute 뒤에 위치해야 한다. 

     자신의 바로 앞에 있는 @ModelAttribute 파라미터의 검정 작업만 하기 때문이다.

1
2
@RequestMapping(value = "/board/add", method = RequestMethod.POST)
public String add( @ModelAttribute("board") Board board, BindingResult result ) {...}
 

13. SessionStatus

 - 모델 오브젝트를 세션에 저장하여 계속 사용한다. 더이상 모델 오브젝트를 사용하지 않을 때는 세션에서 제거해 줘야 한다.


14. @RequestBody

 - HTTP body 부분만 전달 한다. XML 이나 JSON 으로 출력 할 경우 사용한다.

   리턴타입의 @ResponseBody 를 참조하자.

 

15. @Value

 - 프로퍼티값이나 값을 파라미터에 적용한다.

1
2
3
4
5
6
7
8
9
public class BoardController {
    @Value("${eng.url}")
    String engUrl;
 
    @RequestMapping(..)
    public String gotoEng() {
        return this.engUrl;
    }
}
 
 - 위는 프로퍼티중 eng.url 의 값을 String engUrl에 매핑 시키고 메소드에서 사용한 케이스다. 파라미터에도 적용 된다.

1
2
3
public String gotoEng( @Value("${eng.url}") String engUrl ) {
    return engUrl;
}
 

16. @Valid

 - JSR - 303 검증기를 이용해서 @ModelAttribute를 검정하도록 한다.

1
public String add( @Valid @ModelAttribute("board") Board board, BindingResult result ) { ...}


저작자 표시 비영리 변경 금지
신고

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret