Spring Boot에서는 Thymeleaf와 JSP를 함께 사용할 수 있지만, 각각의 View Resolver 설정을 명확히 분리해야 한다. 일반적으로 Thymeleaf는 templates 경로, JSP는 WEB-INF 경로로 구분하여 처리한다. 다만 구조가 복잡해지고 유지보수가 어려워질 수 있어, 실무에서는 하나의 템플릿 엔진으로 통일하는 것이 권장된다.
ReadJPA는 엔티티 객체와 DB 테이블을 매핑하여 객체지향적으로 데이터를 다룰 수 있게 해주는 ORM 기술이다. 하지만 내부적으로는 영속성 컨텍스트, 변경 감지(Dirty Checking) 등 동작 원리를 이해하지 않으면 예상과 다른 쿼리나 성능 문제가 발생할 수 있다. 따라서 단순 CRUD 수준을 넘어서 JPA의 동작 방식과 생명주기를 이해하는 것이 실무에서 매우 중요하다.
ReadTomcat 8.5에서는 Hot Deploy/Reload 기능을 통해 서버 재시작 없이 변경된 클래스 반영이 가능하다. 하지만 신규 클래스 추가나 구조 변경은 반영되지 않아 결국 재기동이 필요한 한계가 있다. 또한 reload 기능은 메모리 누수나 안정성 문제 등으로 운영환경에서는 주의해서 사용해야 한다.
ReadJDK에서 제공하는 기본 HotSwap 기능은 디버깅 편의 수준으로 제한적이며, 클래스 구조 변경(필드/메소드 추가 등)은 지원하지 않는다. 따라서 실무에서 자유로운 클래스 리로딩을 하려면 JVM 한계를 보완하는 별도 도구나 에이전트 기반 방식이 필요하다.
ReadWAS에서 Class Reloading/HotSwap은 서버 재시작 없이 변경된 클래스 바이트코드를 즉시 반영하는 기술이다. 하지만 JVM 기본 HotSwap은 메소드 내부 수정만 가능하고 구조 변경(필드/메소드 추가 등)은 제한적이어서, 이를 보완하려면 별도 도구(JRebel 등)가 필요하다.
Read배포환경 별로 설정파일을 분리하는 방법은 여러가지가 있는데 그냥 properties 파일 안에 개발인지 운영인지 구분하는 프로퍼티를 설정하고 deploy 할 때마다 그 프로퍼티만 dev에서 live로 바꿔서 올리는 방법이 있고 WAS 기동시 argument를 넘겨서 Spring의 context.xml에서 인식하게 하여 구분하게 하는 방법, 그리고 maven이나 gradle 로 빌드할 때 프로퍼티를 줘서 build를 배포환경 별로 달리 수행되게 하는 방법이 있는데 내가 보기엔 마지막 방법이 가장 나아보인다. 왜냐면 첫번째나 두번째 방법은 운영에 배포할 때 개발환경의 프로퍼티 파일이 war에 포함되서 결국 더미 파일을 가지고 있을 수 밖에 없는데 maven이나 gradle를 활용하는 방법은 아예 배포환경에 필요한 파일들만 포함시켜서 deploy 할 수 있기 때문이다.
Read개인 프로젝트에서 페이스북 소셜로그인을 구현하려는데 해보니까 진짜 쉽지만 초반에는 하루 이틀정도 헤멨던 것 같다. Spring.io에서 예제들을 열심히 찾았지만 Spring boot 사용을 전제로 해서 내놓은 것이라서 예시에서는 자동적으로 되던 것이 당연히 내 프로젝트에서는 안됐고 적지않은 구글링을 했어야 했다.
ReadNode.js Express 앱 생성 후 루트에 Procfile(web: node ./bin/www)을 추가하고, 라이브러리는 반드시 npm install --save로 설치하여 package.json 의존성을 정확히 관리해야 Heroku Deploy 시 오류가 없다. Heroku 대시보드에서 앱 생성 후 CLI로 heroku git:remote로 원격 Repository를 설정하고, git push heroku master 한 번으로 프레임워크 자동 탐지 및 Deploy까지 완료된다. 설정이 극히 간단하여 프로토타입/테스트 용도로는 훌륭하나, 해외 서버 위치로 인한 응답 지연, Sleep 모드 자동 전환, DB 성능 문제 등으로 정식 서비스는 유료 플랜 전환이 필요하다.
ReadHttpServletRequestWrapper 를 상속한 확장 클래스를 만들어 getParameter, getParameterValues, getHeader 메서드를 오버라이드하고, 네이버의 lucy-xss-filter 라이브러리로 Escape 처리한 값을 리턴하도록 구현한다. lucy-xss-filter는 XssPreventer(단순 문자열 전체 Escape)와 XssFilter(HTML 태그가 필요한 본문은 스크립트만 선별 필터링) 두 가지를 제공하며, 파라미터명이 content로 시작하면 XssFilter를, 그 외에는 XssPreventer를 적용한다. Spring의 OncePerRequestFilter 를 상속한 CrossSiteScriptingFilter를 만들어 GET/POST 요청에만 XSS 필터를 적용하고, web.xml에 등록하면 비즈니스 로직에 손대지 않고 일괄 처리가 완성된다.
ReadOSX 엘 캐피탄에서 pip install "ipython[notebook]" 시도 시 오류가 발생하는데, 이는 엘 캐피탄의 보안 설정으로 인해 내장 Python 환경에서 패키지 설치가 제한되기 때문이다. easy_install로 Numpy/Pandas 등은 설치되지만 ipython 설치 시에는 여전히 오류가 발생하므로, /usr/local 디렉터리 퍼미션 조정 후 Homebrew로 Python을 재설치하는 것이 올바른 해결책이다. Homebrew로 Python 재설치 후 sudo pip install "ipython[notebook]" 을 실행하면 정상적으로 설치된다.
Read