어제부터 진짜 미치고 팔짝 뛰는 에러가 진짜 평화롭던 날에 갑자기 튀어 나가서 마우스를 내리친게 몇 번인지 모르겠다. 에러는 [com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionException] 인데, 그냥 gralde프로젝트 빌드 시 아래 빨간 줄의 exploded war이 생성되는 경로를 톰캣이 못 찾아서 생기는 에러이다. 여기까지는 오케이, 그럼 생성을 하자! 하고 빌드를 다시 때렸는데 무슨 짓을 해도 그냥 war은 생성이 되는데 exploded 가 생성이 되질 않는다. gradle clean만 수십번, 프로젝트 재생성만 10번은 한 것 같다. 찾아보니, 인텔리제이 settings - Build,..
Spring 토이 프로젝트에 log4j2와 slf4j를 적용해봤는데, 그 과정에서 꽤나 헤매서 정리를 좀 하려고 한다. 기본적으로 log4j.xml 에서 spring 구동 정보는 모두 DEBUG로 띄우도록 하고, AspectJ의 Before, After를 사용하여 프로젝트의 모든 메서드 시작 전, 후에 로그를 찍도록 설정했다. 1. dependency 추가 log4j-core와 이를 구현하기 위한 slf4j, 그리고 이 둘을 바인딩하기 위한 slf4j-simple까지 gradle에 추가해준다. ◎build.gradle implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.17.1' implementation gro..
Intellij를 사용하여 gradle 기반의 Spring MVC 구조를 생성하려고 한다. - JDK: 1.8.0_261 - Spring framework: 5.2.3 RELEASE - tomcat: tomcat 8.0 1. new project 생성 Gradle - java를 체크하고 JDK 버전을 확인한 후, 새 프로젝트를 생성한다. 2. build.gradle 작성 Spring MVC를 구성하기 위해 필요한 라이브러리를 직접 build.gradle에 작성하여 빌드한다. 또한 war 생성을 위한 플러그인 설정도 추가한다. ○build.gradle plugins { id 'java' id 'war' //get added } group 'org.example' version '1.0-SNAPSHOT' r..
지금까지 정리한 개념을 모두 사용하여, Mybatis를 사용한 Spring 프로젝트를 하나 간단하게 만들어보자. 해당 Web App은 아래 완성 화면과 같이 할일을 등록하고 해당 업무를 "해야할 일", "진행 중", "완료" 의 3가지 카테고리로 나누어 표시하는, 간단한 스케쥴러이다. 순위 우측에 버튼을 누르면, DB가 갱신되어 해당 업무의 진행 현황을 변경하는 동적인 Web App 이다. 바로 들어가보자. 1. 사용할 라이브러리 설치 ◎pom.xml org.mybatis mybatis 3.3.1 org.mybatis mybatis-spring 1.2.4 org.springframework spring-jdbc ${org.springframework-version} commons-dbcp commons-..
JSON은 JavaScript Object Notaion 의 약자로, 다른 시스템(다른 언어)와 어떤 정보를 교환하기 쉽도록 고안된 데이터 형식으로 다음과 같이 키:값 형태로 표현한다. { "seq":1, "title":"one" } 바로 확인해보자. 1. JSON 형식 1) Jackson2 라이브러리 설치 pom.xml 에 dependency 를 추가하여 라이브러리를 설치한다. ◎pom.xml com.fasterxml.jackson.core jackson-databind 2.7.2 2) HttpMessageConvertor 등록 일반적으로 브라우저에서 서블릿이나 jsp 파일을 요청하면, 서버는 클라이언트가 요청한 서블릿이나 jsp를 찾아서 실행한다. 그리고 그 실행 결과를 Http 응답 프로토콜 메시지..
Spring은 jsp 페이지를 다양한 언어로 지원할 수 있도록 할 수 있는 다국어 처리 기능 또한 가지고 있다. 1개의 페이지를 3가지 언어로 제작하려면, 언어별로 jsp 파일을 만들 필요가 없이 properties 파일을 사용하여 자동 맵핑하게끔 할 수 있다. 1. message 파일 작성 사용자가 원하는 언어로 메시지를 출력하려면 각 언어에 따른 메시지 파일을 작성해야 한다. 기본적이로 이 메시지 파일은 properties 파일을 이용하며, 해당 언어를 사용하는 Locale 정보를 결합하여 작성한다. (한글의 경우, txt 파일로 먼저 작성 후, properties 파일에 옮기면 STS 가 알아서 변환해준다.) 1) messageSource_ko.properties # login.jsp message..
일반적인 Dynamic Web 프로젝트에서 한번 파일 업로드/다운로드를 다룬 적이 있다. Spring 환경에서도 마찬가지로 이 기능들을 구현할 수 있는데, 다른 점은 apache 에서 제공하는 Common FileUpload 라이브러리를 사용하며, pom.xml 파일과 스프링 설정 파일을 조금 수정해줘야 한다는 점이다. 바로 들어가보자. 우선 View 에서 파일을 서버로 보낼 수 있게끔 수정해준다. ◎insertBoard.jsp 글 등록 Log-out 제목 작성자 내용 업로드 글 목록 가기 File 타입이 하나 더 생성되었으므로, VO 파일(Command 객체) 도 다음과 같이 수정한다. ◎BoardVO.java public class BoardVO { private int seq; private Str..
지금까지 Spring MVC 를 구현하면서 진행한 전체 작업을 "2-Layered" 아키텍쳐 스타일이라고 하며, 이를 그림으로 나타내면 다음과 같다. 이때, presentation-layer 에서 Controller 가 서비스를 스캔할 수 있도록하는 설정 파일인 "presentation-layer.xml" 파일이 /WEB-INT/config 폴더 내에 존재하며, Controller객체들이 생성되기 전에 먼저 사용할 비즈니스 컴포넌트들을 메모리에 생성하기 위한 "applicationContext.xml" 파일이 src/main/resources 폴더에 존재한다. Spring 초반부터 MVC 구현을 들어가기 직전까지 실습을 진행했던 DB. AOP 등과 같은 설정은 바로 이 applicationContext...
지금까지 Spring MVC 예제 구조를 구성하면서 Controller는 항상 DAO를 직접 사용했는데, 이는 DAO를 수정할 필요가 있을 때, 컨트롤러를 직접 다시 건드려야 하기 때문에, Spring MVC 구조에서 요구하는 바는 절대 아니다. 따라서 Spring 초반부에 실습했던 것 처럼 인터페이스를 활용하여 Controller에 의존성을 주입하는 방식으로 구성해야 한다. 이렇게 구성하는 또 다른 이유는 Service를 구현받은 Service 클래스가 없을 경우, 우리는 어드바이저를 구성할 수 없고, 이를 이용한 AOP 구성 또한 불가능해지기 때문이다. 이전에 한번 포스팅했던 내용이기 때문에 따로 자세한 설명은 생략하겠다. ◎BoardService(interface) package com.freefl..
@SessionAttribute는 수정 작업을 처리할 때, 유용하게 사용할 수 있는 어노테이션이다. 모든 Controller 메서드는 Command 객체(VO 객체)를 전달 받아서 자동으로 처리되는데, 이때 사용자가 입력하지 않은 값또한 VO 객체에 포함이 되어 있다면, null 값으로 입력되어 함께 전달되게 된다. 대부분의 경우, null 값을 함께 전달해도 별 문제가 되지 않지만, 따로 주의하지 않고 프로젝트를 짜는 경우, 이 null 값이 DB에 함께 저장되어 출력이 되는 경우가 간혹 생기곤 한다. 이런 문제를 방지하기 위해 Spring은 @SessionAttribute 어노테이션을 제공한다. 우선 @SessionAttribute는 기본적으로 @SessionAttribute("변수명") 형태로 사용..
- await
- javascript
- 인천 구월동 맛집
- react
- 정보보안기사 #실기 #정리
- 이탈리안 레스토랑
- Promise
- 인천 구월동 이탈리안 맛집
- AsyncStorage
- Async
- react-native
- redux
- redux-thunk
- 맛집
- 파니노구스토
- Total
- Today
- Yesterday