목록중앙 HTA (2106기) story (180)
날아라쩡글이의 블로그입니다.
요청파라미터의 경우 폼입력값을 담는다. 그러나 @LoginUser는 요청파라미터가 새로 만든게 아니고, 원래 있던것을 사용할 것이기 때문에 어노테이션@LoginUser로 생성한다. argument로 만드는 것은 힘들지만, 한번 만들어두면 편하다는 장점이 존재한다. 인터셉터 만들기 인터셉터란 컨트롤러의 요청 핸들러 메소드 실행 전처리/후처리를 구현하는 객체이다. interceptor을 담을 패키지를 설정한다. 클래스를 생성한다. LoginCheckInterceptor으로 설정한다. HandlerInterCeptor를 상속받는다. 그리고 메소드 재정의를 진행하는데, default값으로 되어있기 때문에 강제적으로 나오지 않는다 preHandler, postHandler , afterHandler의 메소드를 재..
지금까지 코딩의 모습을 보면 @GetMapping("/add.do") public ResponseDto add,int bookNo) { User user = (User)(SessionUtils.getAttribute("LOGIN_USER")); if(user == null) { throw new CartErrorException("장바구니 아이템 추가는 로그인 후 가능합니다"); } } 이렇게 User의 객체를 SessionUtils에서 뽑아서 확인하는 방법을 이용했다. 그러나 이런 반복적인 업무를 이제는 spring의 어노테이션으로 등록하여, SessionUtils의 User을 생성하게 만들고 객체의 획득을 이용해서 사용하고, 제공받길 원한다. 그것을 AgumentResolve를 이용하여 획득하는 것이..
먼저 파일 업로드를 지원하는 라이브러리 의존성을 추가한다. maven에서 commons을 검색한다. fileupload의 의존성을 다운받고, pom.xml에 추가한다. commons-fileupload commons-fileupload 1.4 DispatcherServlet에서 Bean_name은 마음대로 설정해도 되지만 sping MVC가 사용할 수 있게 이름을 설정해두는 것이 몇가지가 존재한다. spring에서는 해당이름이 맞지 않으면 다른걸 bean으로 등록하기 때문에 마음대로 변경해서는 안된다. id를 꼭 잘 지정해야한다. 1. 파일업로드 multipartResolver 2. 국제화처리 localResolver 3.HandlerAdapter 4.HandlerMapping context-web에 첨..
완전한 Rest는 자원의 이름으로 구분하여 해당자원의 상태(자원)을 주고 받는 것이다. HTTP URL을 사용해서 자원의 이름을 명시하고 HTTP method를 사용해서 해당자원의 대한 작업을 지정하는 것이다. 지난번에는 RestController로 JSON을 올리는 방식을 진행했다. 그러면 삭제를 진행하면 어떻게 될까? 요청JSON을 올리면 응답데이터로 뭔가가 와야한다. 1. 방금 삭제한 것을 다시 내려준다. 2. 삭제 데이터에 대한 성공과 실패여부를 내려줘야한다. 삭제를 진행하게되면 우리는 지운 데이터가 다시 내려오는 것을 원치 않는 다 그렇기 때문에 삭제가 성공 혹은 실패에 대한 내용을 내려주는 것이 좋다. 모든 응답을 정형화해서 내려주는 것이 좋다. true - 잘못된 내용이다. JSON텍스트가 ..
이제는 body부내에 자바스크립트를 작성할 예정이다. HTML DOM객체가 준비되면 즉시 코딩된 스크립트가 실행된다. (HTML DOM이 화면에 렌더링 되기 전에 미리 스크립트 작업이 완료된다. 즉, 엘리먼트에 이벤트 핸들러 함수를 등록하는 것, 특정엘리먼트를 감추는 것, 서버와 통신해서 초기화면에 필요한 데이터를 획득하는 작업 등 다양한 작업을 HTML DOM이 화면에 렌더링 되기전에 수행할 수 있다. 함수안에서 선언한 모든 변수, 함수, 객체들은 그 함수의 범위를 벗어나지 않는다. 즉, 브라우져 전역객체(Window객체)를 오염시키지 않는다. 사용자가 정의한 변수나 함수가 이미 다른 사용자가 정의한 변수나 함수를 덮어쓸 가능성을 없애준다. 단점은 html태그에서 function안에 선언된 함수를 이용..
AJAX처리를 위해 RestController설정방법과 자바객체를 json텍스트로, json형식의 텍스트를 자바객체로 변환시키는 라이브러리 의존성 추가 maven에서 jackson을 검색하고 databind의 의존성을 추가한다. com.fasterxml.jackson.core jackson-databind 2.13.1 방법이 2가지가 존재한다. 첫번째는 restController의 패키기지를 만들어서 @RestController어노테이션을 붙이고 @RequestMapping("/rest/book")으로 경로를 설정하는 방법이 있다. 두번째는 일반 @Controller의 어노테이션을 붙이고 return의 객체 앞에 @ResponseType을 붙이고 작성하는 방법이다. 요청핸들러 메소드가 반환하는 값을 응답..
springMVC 실행순서 클라이언트가 웹서버로 요청을 보낸다. 웹서버가 요청객체와 응답객체를 생성한다. 웹서버가 DispatcherServlet의 Service(Request req, Response res :앞으로는 변수명으로 작성예정) 메소드를 실행한다. Handler Mapping에게 요청 URL을 보낸다, Handler Mapping은 요청 URL을 분석해서 요청URL과 mapping된 요청 핸들러 메소드를 실행할 HandlerAdapter객체를 반환한다. DispatcherServlet은 HandlerAdapter의 Handler(req, res)메소드를 실행한다. HandlerAdapter는 Interceptor를 실행해서 요청핸들러메소드 실행전처리를 수행한다. HandlerAdapter는 ..
Mybatis가 제공하는 타입 명칭 int , string, long, double, date map : map은 인터페이스여서 객체생성이 불가능하다, parameterType에서 사용가능하다. 그릇으로 사용가능하지만 resultType에서는 사용불가능하다. hashMap : resultType에서 사용가능하다. 주로 ResultType에서만 사용한다. bigdecimal java.math.BigDecimal 객체의 프라퍼티는 map의 key와 동일하게 사용한다. 사용자 번호로 검색 * Map map = new HashMap(); * map.put("no",100); * User user = userDao.getUser(map); * * 사용자 아이디로 검색 * Map map = new HashMap()..
opt와value의 값이 하나도 안들어가면 where이 없도록 동적인 다이나믹쿼리를 해주는 것이 where태그이다. where 태그를 이용해서 여러 값을 result해볼예정이다. pagination을 입력하자 요청 URL : localhost/book/list.do localhost/book/list.do?page= ? 이러면 page가 값이 없을 때 error가 발생한다. page가 null이거나 null이 아닐 때는 어떻게 해야할까? @GetMapping("/list.do") public String list(@RequestParam(name = "page", defaultValue = "1", required = false) String page, Criteria criteria ,Model mod..
Criteria : 기준, 표준의 복수형 form 객체로 등록한다. 내용은 opt와 value라는 속성으로 정의하고, 기본생성자와 getter/setter로 정의한다. 이제 검색을 통해보일 Controllerdp Criteria를 매개변수로 정의하고, Controller에는 if(StringUtils.hasText(criteria.getOpt()) && StringUtils.hasText(criteria.getValue())) { // criteria의 opt에 text가 존재하고 또는 criteria의 value에 text가 존재하면 List books = bookService.searchBook(criteria); //객체가 출력되고, model.addAttribute("books",books); /..
자바에서 nullPointerException이 발생하는 것을 방지하기 위해서 만든 API이다. 자바 8에 도입된 API이다. nullPointerException을 피하기 위해서 null인지 아닌지 null을 검사하는 기능이 포함된 optional가 추가되었다. optional는 null이 될수도 있는 ㄱ밧을 값싸는 wapper클래스다. 주요API optional.of(T value) null아닌 값이 저장된 optional객체를 반환한다. optional.ofNullable(T value) null일수도있는 값이 저장된 optional객체를 반환한다. optional.empty() 아무값도 가지고 있지 않은 비어있는 optional객체를 반환한다. ifPresent() optional객체에 저장된 값..
java 8부터 추가된 API이다. 배열이나 콜렉션에 저장된 데이터를 처리하기 위해서 도입했다. 이전에는 for문과 iterate를 사용해서 처리했다. 다양한 방식으로 저장된 데이터를 처리하기 위한 공통적인 처리방법을 제공한다. 배열과 콜렌션, 파일에 저장된 데이터를 통일시켜버린다. stream API의 특징 내부방법을 통해서 작업을 수행한다. List numbers = List.of(10,20,30,40,50); for(int num : numbers) { System.out.println(num); //외부반복 } numbers.stream().forEach(job -> System.out.println(num)); //람다식을 이용한 내부반복 스트림은 단 한번만 사용가능하다. 일회용이다. 연결하려면..
Model은 spring은 Controller와 Request, Response가 직접 연결되는 것을 싫어하기 때문에 Dispatcher을 이용하여 이동하게 된다. Model은 view가 옮겨 놓으며, 내부이동할 때 사용할 수 있는 데이터를 담고 있는 값이다. Redirect경우에는 model에 담으면 안된다. 재요청 URL의 경우 요청객체와 응답객체가 새롭게 생기기 때문에 값을 담아도 새로 만들어지는 요소에는 값이 없기 때문에 Redirect를 할 경우 model의 값을 담으면 안된다. 매개변수로 RedirectAttribute를 설정하고, addAttribute로 담아두면 된다. Session에 해당하는 개인정보들은 addFlashAttribute에 담아두면 된다. Session에 저장되는데, 1회성..
com.sample = 회사 도메인 spring-mybatis = 프로젝트명 0.0.1-SNAPSHOT = 버젼의 넘버링 war 톰켓서버의 배포 Jar 자바의 application을 압축한 폴더 War web package(web)의 package를 압축한 폴더 Ear 자바를 EJB서버를 이용해서 압축한 폴더 우리는 web을 만들기 때문에 war로 설정한다. = 앞으로 작성할 때 사용할 방식 encoding=UTF-8 자바의 버젼=11 스프링의 버젼= 5.3.14 그럼 앞으로 스프링 버젼이 동일하다면 ${spring.version}사용할 수 있다. spring-context 와 spring-webmvc의 차이 spring-context web용 springContainer의 jar파일이다. 웹서버에서 c..
new ->project ->maven -> new maven project설치 고를 수 있는 project로 All catagory를 클릭한다. org.apache.maven.web클릭 후 완성을 클릭한다. pom.xml에서 UTF-8을 11로 변경하고 maven에서 update를 진행한다. properties-> targetRuntime->아파치를 9로 설정한다. 실무에서는 java8,9를 사용할 것이다. 프로젝트는 유지보수가 중요하기 때문에 검증된 것을 사용할 것이고, 톰캣도 낮아서 걱정할 필요는 없을 것이다. pom.xml설정방법 mvnrepository.com으로 접속한다. 의존성 주입 1. spring web application개발에 필요한 라이브러리 의존성 추가 org.springframe..
myBatis란 SQL mapper Framwork 이다. [파라미터 객체]-[SQL]-[리절트 객체] paramether객체 SQL실행에 필요한 값을 표현하는 객체 result객체 SQL실행결과 값을 표현하는 객체 예시 insert int employees(employee_id, first_name, last_name) values (employees.seq.nextval, ?, ?) 필요한 값이 2개가 필요하다. 파라미터의 객체 : Employee 객체가 필요하다 SQL 실행에 필요한 값을 Employee객체에 담을 수 있다. 리절트 객체는 없다. insert, update, delete작업은 조회하지 않는 작업으로 객체가 존재하지 않는다. 예시 delete from employees where de..
어노테이션의 구성 @Target과 @Retention은 꼭 필수로 입력되어야한다. @Target 어노테이션의 부착대상을 지정한다. ({ElementType.CONSTRUCTOR : 생성자에 부착해도 된다. ElementType.METHOD : 메소드에 부착해도 된다. ElementType.PARAMETER : 매개변수 메소드에 부착해도 된다. ElementType.FIELD : 클래스의 멤버변수에 부착해도 된다 ElementType.ANNOTATION_TYPE : 다른 어노테이션 타입에 부착해도 된다. ElementType.TYPE : 클래스, 인터페이스에 부착해도 된다. }) ({부착대상, 부착대상, 부착대상}) 배열의 형태로도 올 수 있다. @Retention 어노테이션의 유지되는 시점을 정의한다. ..
요청 URL http:// localhost:8080/emp/detail.do?id=102 요청 핸들러 메소드 @RequestMapping("/detail.do") public String detail(){ return "employees/detail.jsp"}; id값이 필요하다. 이제는 jsp에 id=""처럼 넣지 않고, 요청핸들러메소드에서 id가 필요시 detail(int id)처럼 매개변수선언하면 spring이 자동으로 요청파라미터값을 확인하고 해당하는 변수이름 값에 값을 저장한다. 2개면 detail(int id, int cpno)처럼 요청파라미터의 값을 획득할 수 있다. 똑같은 이름의 변수를 선언하면 RequestMappingHandlerMapping이 Arguments: [{}] 핸들러 메소..
기본적으로 Spring Container는 2개로 만들 수 있다. 하나는 Root Spring Container 와 Child Spring Container이다. ServletContext는 web이 시작되는 시점에 만들어진다. 웹서버가 시작될 떄, 웹서버가 종료될 때 실행할 작업을 구현한다. ServletContextListener 인터페이스를 구현한 사용자 정의 ServletContextListener를 정의한다. ServletContextListener의 ContextInitialized()는 ServletContext의 초기화가 완료되면 실행되는 메소드다 ServletContext의 초기화는 서버가 시작될 때 완료 된다. ServletContextListener의 ContextDestroyed()..
BasicDataSource connectionPool을 가지고 있다. 데이터베이스에서 밀리 Connection객체를 만들고 보관, 관리하고 있다. 미리 connection을 맺고 있기 때문에 connection에 대한 시간이 줄어 든다. common-dbcp 라이브러리가 제공하는 BasicDataSource는 가장 일반적으로 많이 사용되는 DataSource의 구현체이다. jdbc드라이버의 클래스명, 데이터베이스 접속 URL, 사용자명, 비밀번호를 제공해야한다. 종류가 많고, DataSource를 구현한 객체이면 된다. JdbcTemplate int update(String sql, object...args) insert, update, delete T queryForObject(String sql, ..