목록Java/Spring (28)
진이의 Developer Story
스프링 부트가 많이 쓰임에 따라, 내장된 톰캣을 많이 사용하고 있다. 기존에는 톰캣을 따로 다운받아서, server.xml 등을 수정하여 톰캣을 사용했지만, 스프링 부트에서 제공을 하는 내장 톰캣의 경우 application.yml 이나 properties를 통하여 설정하거나 java 코드로 설정(ajp 등)하여 사용한다. 그런데 외부 톰캣을 사용할 경우, Project > Build Automatically 체크 후 server.xml 에서 reloadable만 false로 해주면 간단하게 Hot swapping이 되어, 메소드를 추가, 제거, 기타 ORM을 사용하여 쿼리를 작성하는 부분외에는 재시작없이 수정된 코드를 바로 확인해볼 수 있었다. 스프링 부트는 이번이 써보는 것이 두 번째인데, 저번에는 ..
포워드IP의 경우 제대로 걸러지지 않는 경우가 있다. 헤더에서 구분하여 IP값을 받아오자. public static String getClientIP() { HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest(); String ip = request.getHeader("X-FORWARDED-FOR"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.len..
저번에 만들어두었던 별풍선 수집기에 문제가 있음은 진작에 알고 있었다.잘못된 네티의 사용방법, 설계상의 문제로 하루에 한번은 재시작을 해주어야 했는데...이번에 다시 한번 새로 설계하여 제작해봤다. 한번도 사용해보지 않은 스프링 부트를 사용하며, 지금까지 스프링에 대한 이해가 얼마나 부족한지도 깨닫게 되더라.아무래도 웹어플리케이션이 아니다 보니, 스코프에 대한 이해가 부족하여 의존성 주입이 안되는다던지 등... 새롭게 공부를 한 느낌이 든다. 네티는 이번이 2번째 사용이다보니 저번보다 훨씬 수월하게 코딩이 되었다.아래는 스프링부트로 만들어본 새로운 버전의 수집기. 며칠돌려보고 에러가 없다면 좋을것 같지만...재부팅없이 며칠을 버텨줄지 모르겠다.
해결방법 1. XML에서 JobDetailBean을 만들때, jobDataAsMap 프로퍼티에서 Service 객체를 등록한다. context-scheduler.xml BatchJob.java public class BatchJob extends QuartzJobBean { /** * Logger */ private static final Logger LOGGER = LoggerFactory.getLogger(BatchJob.class); /** * BatchService */ private BatchService batchService; public void setBatchService(BatchService batchService) { this.batchService = batchService; } ..
기억이 새록새록납니다.이 시절에는 스프링을 제대로 접해보지 못하고 무작정 만들었던 기억이 나네요. 트랜잭션 처리도 어설프게 설정이 되었고, 허술투점의 프로젝트였죠. 지금 생각해보면 나름 디자인쪽에 신경쓴다고 많이 신경썼었던 것 같네요.=> 알맹이 생각은 못하고 껍데기만 치중했던 것 같습니다. 다시 만든다면 제대로 만들 자신은 있지만...디자인을 다시 할 생각을 하니 항상 접어두게만 되네요... 그 당시 만들었던 프로젝트 사진을 투척해봅니다. 허접하기 그지없네요~ㅋㅋ 마지막으로 이런 프로젝트를 준비하고 계신분들께 한마디 하고 싶다면, 테스트주도 개발을 하셨으면 좋겠어요. 생각보다 프로젝트 규모가 크더라구요...대충 설계하고 만들다가는 중간에 포기하기 쉽습니다... DB는 라이엇에서 제공해주는 DTO 대로 ..
@ControllerAdvice public class HTTPErrorHandler { @ExceptionHandler(NoHandlerFoundException.class) public String httpError404() { return "/common/exception/pageNotFound"; } } 위와 같이 컨트롤러를 만들어준다. @ControllerAdvice 어노테이션을 사용한다. (Spring 4.0 이상에서 사용가능) 만약에 4.0 이하라면 web.xml에서 error-list 를 이용하여 처리해야 한다. 해당 방법은 다음 포스팅때 적도록 하겠다. 아래는 web.xml 설정방법이다. spring org.springframework.web.servlet.DispatcherServlet..
심각: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/]] at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:192) at org.apache.catalina.core.ContainerBase.startInternal(..
1. Credentials 생성 Credentials을 클릭합니다. (SSH Private Key를 등록해야 합니다) 이 작업을 하기 이전에 public 키와 private 키를 한쌍 만드셔야 합니다. $ ssh-keygen -t rsa Enter file in which to save the key (/root/.ssh/id_rsa): # 경로 적고 엔터 Enter passphrase (empty for no passphrase): # 비밀번호를 쓸 경우 입력하고 아닌 경우는 엔터 이렇게 하시면 ssh-key 한쌍이 만들어집니다. Add Credentials 를 누르시고 Credentials 를 만듭니다. $ vi ~/.ssh/id_rsa vi 편집기로 private key를 열어 복사해주신 후, Ke..
// smtp 서버주소 // port : smtp 서버포트 // 사용자 아이디 // 사용자 비밀번호 // 인코딩 방식 smtp // 메일서버 프로토콜 (smtp) false // 인증여부 (false라면 미인증, 단 서버에서 허용IP 설정이 되어야 함.) true * username 과 password는 인증없이 사용한다면 공백으로 두어도 됩니다. @Resource(name = "mailSender") private JavaMailSender javaMailSender; // DI MimeMessagePreparator preparator = new MimeMessagePreparator() { @Override public void prepare(MimeMessage paramMimeMessage) t..
안녕하세요. 저희는 ckeditor를 사용하고 있었는데요. 클라이언트가 불편하다고 해서, 대체 에디터를 찾다가 스마트에디터를 발견했습니다. (클라이언트가 가장 많이 쓰는건 엑셀에서 작업한 내용을 올리는 것이라고 했습니다.) * 스마트에디터는 네이버에서 개발한 오픈 위지윅스입니다. 가장 좋은건 엑셀에서 표 붙여넣기 할때 가장 똑같이 만들어서 복사가 되더군요. 표를 제어할때도 편리하고요~ 일단 변경하기에 앞서서 적용이 일단 잘 되어야 변경계획을 수립할지 결정을 하겠지요. 스마트에디터의 기능으로 html은 잘 작성이 되는데요. 문제는 이미지를 첨부할 때가 문제란 말이죠. 스마트에디터 내에서도 php는 기본적으로 지원이 되는데, 자바로는 포팅해서 사용해야 하더라구요. 인터넷을 찾아봐도 스프링에 맞춘 셋팅 방법은..