org.springframework.web.bind.MissingServletRequestParameterException: Required MultipartFile parameter 'file' is not present




아주 희안한 버그였다 


//Servlet 2. x 에서 사용하는 설정

@Bean

public MultipartResolver multpartResolver() {


CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();


multipartResolver.setMaxUploadSize(1024*1024*100L);

multipartResolver.setMaxInMemorySize(1024*1024*40L);


return multipartResolver;

}




스프링 MultipartFile 로 파일 받아오는 api를 짜고있는데 


PostMan 으로 테스트 해보니  확장자 .mp3  파일은  성공적으로 받아지는데


그 이외의 확장자들은 전부 BadRequest 


org.springframework.web.bind.MissingServletRequestParameterException: Required MultipartFile parameter 'file' is not present
 


이렇게 에러코드 400을 뱉는 것이였다.

(이게 원래는 전부 안되야 되는데 .mp3 확장자만 되는 것은 무엇????)



아 이거 Spring In Action 에서 봤던 내용이였는데 


이걸 읽어놓고 까먹어서 구글링하고 있다



스프링 부트는 1.2.x 버젼 이상에서는 기본적으로 Servlet 3.x 을 사용한다


 서블릿 3.x 이상 스펙에서는  multipartResolver를 외부 라이브러리 없이 


쓸수있게 자체 구현되어있는데 


스프링에서 Servlet 2.x 와 3.x 에서 다르게 구현체를 만들어놓았음



  • Servlet 3.0 Part API를 바탕으로 한 MultipartResolver 인터페이스 구현체
  • bean 을 선언할 때 별다른 확장설정을 하지 않고 “multipartResolver”로 선언
  • multipart와 관련된 업로드 파일 최대크기, 저장위치 등 설정을 하고 싶다면
    • web.xml에서 하거나
    • Servlet 등록하는 과정에서 MultipartConfigElement을 선언하면서 설정
    • @MultipartConfig라는 애노테이션 사용
  • Servlet 3.0 에서는 MultipartResolver 레벨에서 설정하는 것을 허용치 않는다.


  • 출처: http://java.ihoney.pe.kr/351 [허니몬(Honeymon)의 자바guru]




    //Servlet 3 이상 버젼에서의 설정 

    @Bean

    public MultipartConfigElement multipartConfigElement() {

        MultipartConfigFactory factory = new MultipartConfigFactory();


        factory.setMaxFileSize(MAX_UPLOAD_FILE_SIZE);

        factory.setMaxRequestSize(MAX_REQUEST_SIZE);

        factory.setFileSizeThreshold(FILE_SIZE_THREADHOLD);

        


        return factory.createMultipartConfig();

    }


    @Bean

    public MultipartResolver multipartResolver() {

        return new StandardServletMultipartResolver();

    }

















    해결 방법 참고 url


    https://www.cameronezell.com/failed-to-start-service-unit-service-not-found/





    스프링 부트 jar 파일을 Aws에 배포하려고 


    서비스 등록을 하려고 스크립트 파일을 짜서 올렸는데 


    Failed to start service: Unit service not found 


    계속해서 서비스 파일이 등록안되고 찾을수 없다고 에러가 떳다





    원인은 이거다 


     It turns out that between the LTS versions of Ubuntu, Canonical decided that 15.04 would be the start of a transition from upstart to systemd as the default for managing boot and system service startup.


    Ubuntu의 LTS 버전 사이에서 Canonical은 부팅 및 시스템 서비스 시작 관리를위한 기본값으로 15.04가 upstart에서 systemd 로의 전환의 시작이라고 결정했다.






    우분투 14 에서 16으로 버전이 올라가는 과정에서 무언가가 있던게 사라진듯 싶다...



    해결법


    1. sudo apt-get install upstart-sysv

    2. sudo update-initramfs -u



    명령어 두번으로 15버젼에서 패치된 내용을 이렇게 적용 줄수있다 
















    뭔가 억울한데 어디 하소연할수도 없고 진짜 하...


    아니.... 



    Retrofit2 로 구글API에서  자바빈으로 안받고  Json객체로 받으려고 


    @GET("maps/api/place/textsearch/json")
    Call<JSONObject> findDestinationWithRadius(@Query("query")String searchKeyword);


    이렇게 줬는데 계속해서 response.body()가 null이 들어오는 것이다..


    아니 이게 파싱이 안되면 익셉션이라도 떠야되는데 


    계속해서 null이 뜨길래 무슨 문제인지 계속 고민하다가 


    하필이면 비동기 통신이라서 동시성문제 인가 싶어서 Thread.sleep으로 일부로 지연시켜보고 별 짓을 다했는데 




    원인은 이거다




    JSONObject => org.json.JSONObject  객체이고


    JsonObject -> com.google.gson.JsonObject 객체이다 



    레트로핏2 빌드할때 GsonConverter를 줬는데 

    Retrofit retrofit=new Retrofit.Builder()
    .addConverterFactory(GsonConverterFactory.create())
    .client(client)
    .baseUrl(BASE_URI)
    .build();



    파싱 반환값음 org.json의 객체인 JSONObject로 반환 받으니까 


    익셉션이 안뜨고 그냥 null로 비워버리는 문제가 발생했다

    (이거 버그 같은데?)



    반환 값을 JsonObject로 바꾸니까 정상적으로 파싱되었다 



    아 진짜 나도 사수가 있었으면 좋겠다 

    무의미한 오타찾기 삽질기간을 줄이고 싶은데 항상 누구하나 물어볼사람은 없고...



    공부는 항상 외롭다.











    405 Get was not supported 


    Swagger2  json으로 문서화 하는건 되는데 


    Swagger-ui.html 으로 접속하려하면 405 Get not supported   가 뜬다


     


    처음에는 스프링 시큐리티 문제인지 알았다. 


    결론 : 정확한 원인은 알수가 없지만  


    스프링 부트 버젼을 1.5.6 으로 올리고 (이건 별 상관 없는듯 싶다)


    내가  해결한 방법은


    thymeleaf 을 활성화 해준 것 이다 . @Controller 하나 따로 파서 


    HelloWorld.html 을 하나 만들어서 thymeleaf 를 활성화 시켜주니 


    Swagger-ui 가  제대로 돌아갔다.


    그 중간과정에 


    버젼 변경이라던지 이것저것 매우 삽질을 했지만 문제는 이것인 것 같다.

    (참고로 최종적으로 적용한 버젼은 2..7.0이다 )









    애초에 하드웨어쪽은 관심이 없으니


    각 부스들의 하드웨어적인 아이템을 제외하고 



    소프트웨어 쪽 IT 기술들만  

    놓고 본다면 

    올해 IT 쇼 주요 키워드는 


    보안&서버 모니터링 솔루션, 

    분산 클라우드,

    VR


    이 정도로 추릴수 있을것 같다.


    드론이라던지, 서버장비 같은 기술도 여럿 있었다


    몰론 나는 클라우드 서비스나 

    서버 모니터링 서비스들이 매우 매력적이였고 흥미로웠으나


    마케팅 이라는 입장에서 바라보았을때 


    정말 흥미로웠던 기술을 


    실시간 고객 분석 소프트웨어이다.





    학생의 신분으로 가서 

    부스가서 궁금한게 있어도 물어보지도 못했다 ;;;



    옆에서 과장님 차장님같은 분들이 와서 질문하니 


    일개 학생에게 여유주기는 힘들었겠지 ㅠㅠ


    귀동냥하듯이 옆에서 줍어 들으면서 구경했다. 






    근데 바디프랜즈는 왜거기 있는거야????







    실시간 고객 분석 소프트웨어 




    이건 정말 멋진 기술이였다. 


    졸업작품 아이템으로 사용하고 싶었다.


    cctv로 점포를 촬영하여 점포에 들어와있는 고객들을 영상으로 인식하여 


    고객이 얼마나 점포에 머물렀는지?

    고객이 어느 가판대에서 어느 물건을 유심히 관찰했는지?


    점포내에 있는 고객들을 실시간으로 분석해준다.


    그러한 실시간 정보들을 모아 

    원하는 단위로 통계까지 내주는 소프트웨어다.




    이러한 기술을 보유한다면 정말 1초단위로 마케팅 전략을 새롭게 세울수 있다.


    카메라가판대를 5분가까이 어슬렁 거리는 고객을 cctv가 영상분석을 통해 

    실시간으로 

    고객의 니즈를 파악할 수 있다. 



    이러한 데이터들이 축적되어 마케팅 부서에 전달된다면


    그 빅데이터는 새로운 사업 의사결정에 큰 도움이 될 것이다.
























    위 업체 기술은 

     관리적 측면 보안 솔루션이다.


    서버 자체의 기술적인 보안이 아무리 좋다 한들


    허술한 보안 의식으로 


    이메일에 포함된  첨부파일 


    신음하는 서민경........제 .avi


    과 같은 파일을 


    아무런 의심없이 컴퓨터에 다운받는순간 


    보안은 무너지고 만다.


    그렇게에 기업들은 보안교육을 실시한다.


    G-POST라는 업체는 기업 보안교육이라는 시장에 


    니즈를 캐취했다.



     


    이 관리적 보안 솔루션은 


    모의 크래킹 공격을 할수있다. 


    블랙햇(Black Hacker) 들이 사용하는 일반 사용자들의 방심을 유도하는 

    방식의 공격기법들을 


    일발 사용자들이 체험해볼수 있다.


    .avi

    .hwp 파일들이 편집모드로 풀리는 순간 


    확장자가 해킹을 위한 .exe 같은 실행파일로 변환된다.


    이러한 내용들을 교육하고 체험할수 있다는 것은 


    효과적이다.










    - 열심히 가져다 본 팜플렛들 -

















    유동인구를 실시간으로 파악할수 있는 기술 


    유동인구들의 특징 ,규모 를 통계내주는걸로 보인다.















    유일하게 학생인 나한테 다가와서 친절하게 설명해주신 부스다.


    현재 정부 공공기관 문서 일부에 적용되어있는 기술이다.


    주민 등록표 같은 중요 문서들이 위조 되었는지를 단순 qr코드를 찍는 행위를 통해 검증할수 있다.


    그리고 qr코드를 찍음으로서 해당 문서에 대한 내용을 음성으로 설명해주는 등


    소외계층을 지원하는 매우 좋은 취지의 기술이다. 



    문서 위조 방지를 위한 기술이고 이 기술을 이용하기 위해서 


    클라이언트 측 회사는 따로 서버를 구성할 필요 없다는 장점이 있다.


    문서 검증에 대한 내용은 보이스 아이 라는 


    이 회사가 소유한 서버에서 처리가 이루어진다. 


















    사업에서 아이템은 정말 중요하다 


    그러나 아이템이 사업의 전부가 아니라는 것을 체감하지 못하는 것 같다.


    대부분의 사람들은 아이템이 사업의 전부가 아니라는 말에는 고개를 끄덕일지 모르겠


    지만 실제로 그에 맞는 행동을 하는 사람들은 많지 않은 듯 하다.




    그저 네이버,카카오 와 같은 스타트업 성공신화를 바라보면서  


    대박을 .. 

    한방을 .. 


    내가 봤을때는


    대박을 노리는 준비되지않은 창업은 


     도박장 빠칭코 기계앞에 앉아서 한방을 노리는 사람들과 


    그 본질이 다르지 않다.   


    이것만 대박나면 ...

    한방만 터져라..


    상황을 고려하지 않고 사업의 규모를 부풀릴려한다.



    머리로 배우는 것을 싫어하는 사람들은 몸으로 배우려고 든다.


    서점에 차고 넘치는 경영학 관련 서적들과 창업에 관련된 서적들을


     한권도 읽을 생각도 없고


     저런 책속에 틀어박힌 재미없는 공부는 필요 없다면서 


    "나의 창의적인 아이디어와 기가막힌 아이템 이라면 성공할수 있어"

     

    사업을 시작한다.


    사회에서 떠드는 창조경제 창의적 인재 이딴 단어들을 뿌려대니 


    책속에서 배울수 있는 기본기를 사람들은 무시하게 된다.


    2만8천원 짜리 책에 쓰여진 내용에는 


    자신이 사업을 하면서 5천만원을 날려먹고 얻을 수 있는 교훈들이 있다. 


    사업이 망하고 난뒤 사람들은 " 큰 교훈을 얻었다, 배움을 얻었다" 라고 하지만


    책속에서 사업중 일어날수 있는 리스크 관리에 대한 내용, 경영상 허점

       

    을 읽고 배울수 있다.



    직접 체험해보는 것이 얼마나 중요한지 모르는 멍청한 사람이 어디 있겠는가?


    다만 2만8천원 짜리 책으로 간접 경험할수 있는 내용을 


    3천만원을 던져가면서 아까운 몇년을 버려가면서 배우기에는 


    기회비용이 너무 차이나지 않는가?





    DDD에 이런 구절이 있다.


    멍청이들을 위한 프레임워크를 작성하지말라 



    평생을 공부에 쏟아야하는 이 일을 선택한것은 내인생에서 큰 축복이다.


    소프트웨어라는 분야에서 


    어제 공부한 내용은 오늘의 나에게 큰 도움이 되는 것은 확실하지만 


    내일의 나에게는 새로운 기술을 배우기를 방해하는 걸림돌이 될수도 있다.



    이 분야에서 절대적인 진리는 없으며    (EX. xx 언어가 최고다 ) 


    어제의 멋진 기술은 레거시코드로 남아서 

    오늘의 나를 괴롭히는 애물단지가 되기도한다



    나의 실력을 현상유지 하기위해서는 새로운 책을 뒤지고 더 멋진 소스코드를 짜내기

    위해 고민해야하는 불안정한 업종이다.



    단순히 취업을 위해 돈을 벌기위해 이 직업을 택한다면 짧게는 3~5년 길게는 10년 안

    에 버티지 못하고 쫒겨 날것이다.



    배우는 것이 즐겁기에 이 직업을 택한 이들은 이 직업이 축복 그 자체다.



    공부를 하면서 누구나 자만에 가득찬 시기가 한번쯤은 오기 마련이다. 


    모든 것을 다 아는 것같고 자신만만한 시기가 있는데 


    나는 책속 예제를 통해 완성한 조그만한 프로젝트 하나를 통해 그런 시기를 맛보았다.

    책속에 깔끔하게 설계된 내용이 얼마나 어려운지 모르고 


    책에서 준비해준 예쁜 UI와 책에 쓰여진 소스코드들을 배껴서 만들어진 나의 결과물은 나를 착각하게 만들기 충분했다.


    빈수레가 요란하다는 것이 이런 것이 아닐까..


    그 조그마한 나의 결과물에서 요구사항을 조금만 비틀어도 나는 그 요구사항을 만족시킬수 없다는 것에서 충격을 먹었다.


    그때의 기고만장하고  멍청했던 나의 모습에 잠자리에 들기 전에 이불킥을 뻥뻥 찬다. 



    그 이후 원리와 설계를 공부하면서 얼마나 내가 멍청한지를 알게 됬다.


    책하나를 공부하면 그 책에서 모르는 용어와 내용을 공부하기위해 


    또 2~3권의 책을 공부해야만한다.


    그 2~3권에 책에도 내가 모르는 내용이 있고 가지를  치듯이  


    공부를 하면 할수록 나의 무지함이 드러난다.



    내용을  깊게 파고들수록  결국 다시 찾게 되는건 


    운영체제, 소프트웨어공학 수치해석 과 같은 


    학교에서 배운 기초적인 내용들이다.








    + Recent posts