- Today
- Total
목록Framework/Spring (14)
개발하는 고라니
웹 서비스를 개발하다보면 하나의 업무 로직에서 반드시 함께 처리 되어야하는 업무 단위가 있다. 예를 들어 송금의 상황에서 A가 B에게 송금을 했다면, A의 통장은 잔고가 업데이트 되어야 하고, B의 통장 잔고 또한 업데이트 되어야 하는데, 예기치 못한 상황이 발생해 A에서 돈이 빠져나갔지만, B에게 돈이 들어오지 않았다면... A에서 빠져나간 돈은 다시 원래대로 복구되어야 할 것이다. 이를 트랜잭션 처리라고 한다. @Transactional 스프링의 트랜잭션은 AOP를 기반으로 동작한다. 즉 메인 로직의 시작과 끝에 붙어 트랜잭션을 처리해주는 것이다. 사실 개발자 입장에서는 @Transactional 어노테이션만 붙여주면 끝이난다. 하지만 이 어노테이션의 옵션을 한번 들여다보자. 전파 옵션 - Propa..
DispatcherServlet 서블릿/JSP을 다룰 때 Controller 단에서 @WebServlet("/test")와 같은 URL Mapping을 설정했고, 클라이언트의 요청을 직접 받아 로직을 수행했다. 스프링에서는 어떻게 처리를 하는지 보자. 개념 Servlet Container에서 HTTP 프로토콜을 통해 들어오는 모든 요청을 프레젠테이션 계층(Controller)의 제일 앞에두어 중앙집중식으로 처리해주는 프론트 컨트롤러 [프론트 컨트롤러란 주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아 처리해주는 컨트롤러인데, MVC 구조에서 함께 사용되는 패턴] 스프링을 사용하면 DispatcherServlet이라는 핸들러 서블릿이 모든 URL로 들어오는 요청을 받아 스프..
위와 같은 웹 페이지가 있을 때, 첨부 파일의 이름을 클릭하면 파일이 다운로드 되도록 하는 법을 알아본다. 우선 첨부파일의 정보를 출력하는 웹 페이지의 HTML일부를 보면 다음과 같다. [[${uploadDTO.fileName}]] "th:"와 같은 문자열이 있는데, 이는 thymeleaf라는 Template Engine을 사용하여 그렇다. 어쨋든 [[${uploadDTO.fileName}]] //------------------------------------------------------- 파일이름 '파일이름'을 클릭하면 '/download?fileName=파일이름'이라는 URL에 'GET'요청을 하게된다. 이 때 파일이 다운로드 되도록 하는 것이다. View 단은 이정도면 되었고, Back단을 살..
첨부파일을 다루다 보면, 파일의 종류, 확장자에 따라 다르게 처리해야할 경우가 있다. 이 때 업로드된 파일의 종류를 알아보려면 Content-Type이 무엇인지 알면 간단하게 판단할 수 있다. Content-Type 서버와 클라이언트가 어떤 자원(파일,문서,데이터 등)을 주고받을 때 웹 서버는 HTTP헤더로 파일이나 자원을 포함하는 바이트의 Stream을 앞에 보낸다. 이런 헤더는 클라이언트에게 웹 서버와 커뮤니케이션 세부사항을 묘사한다. 예를 들어, 헤더는 사용되고 있는 웹 서버의 '소프트웨어의 타입', '서버의 날짜와 시간', 'HTTP 프로토콜', '사용중인 커넥션 타입' 등을 지정한다. 헤더는 또한 클라이언트가 이런 가상 패스나 도메인에 대해 저장해야할 쿠키를 포함한다. Content-Type 개..
1. MultipartFile의 transferTo() 2. FileCopyUtils 이용 파일을 업로드하는 방법은 크게 2가지가 있다. 하나는 HTML의 form태그를 이용하는 것이고, 하나는 ajax를 이용하는 방법이 있다. 업로드한 파일을 로컬 저장소에 저장하는 방법을 알아보고자 한다. # 파일 업로드 Ajax를 이용해 Spring에서 지원하는 Multipart 타입으로 파일을 받는다. 1. C:\upload\temp : 파일 저장 경로 2. 저장될 파일 명 : UUID_filename.png (UUID는 파일의 고유 번호로, 파일명 중복 방지를 위해 적용한다.) # 1. Multipart의 transferTo(Path path) 이용하기 @PostMapping(value = "/upload") p..
* '코드로 배우는 스프링 웹 프로젝트' 교재를 1.5회(?) 완독 후, 스스로의 힘으로 게시판을 구현해보았다. 물론 미흡한 점이 심심찮게 발견되어 수정의 수정을 거듭했다. 그렇게 3~4주를 보내고 나니 다음엔 무엇을 만들어볼까 하던 차에, 문득 떠오른 것이 있다. '무수히 많은 치킨 브랜드가 있고, 그 많은 메뉴들을 한 곳에서 모아보면 어떨까?' 그래서 프로젝트라고 하기엔 뭣하지만 원하는 작업을 구현해보며 모르는 부분이 있으면 배워가고, 알던 내용이 있으면 다시 되새기는 목적을 가지고 시도해보려 한다. 먼저 '푸라닭' 사이트에서 메뉴 정보들을 크롤링해 뿌려주는 식으로 시작해보고 결과가 괜찮으면 다른 브랜드들도 시도해보는 식으로 점차 넓혀가겠다. * 교촌치킨의 메뉴 중 '교촌라이스세트'라는 메뉴의 이미지..
* '코드로 배우는 스프링 웹 프로젝트' 교재를 1.5회(?) 완독 후, 스스로의 힘으로 게시판을 구현해보았다. 물론 미흡한 점이 심심찮게 발견되어 수정의 수정을 거듭했다. 그렇게 3~4주를 보내고 나니 다음엔 무엇을 만들어볼까 하던 차에, 문득 떠오른 것이 있다. '무수히 많은 치킨 가게가 있고, 그 많은 메뉴들을 한 곳에서 모아보면 어떨까?' 그래서 프로젝트라고 하기엔 뭣하지만 원하는 작업을 구현해보며 모르는 부분이 있으면 배워가고, 알던 내용이 있으면 다시 되새기는 목적을 가지고 시도해보려 한다. 먼저 '푸라닭' 사이트에서 메뉴 정보들을 크롤링해 뿌려주는 식으로 시작해보고 결과가 괜찮으면 다른 브랜드들도 시도해보는 식으로 점차 넓혀가겠다. * UploadController를 생성해 이미지 파일 di..
* '코드로 배우는 스프링 웹 프로젝트' 교재를 1.5회(?) 완독 후, 스스로의 힘으로 게시판을 구현해보았다. 물론 미흡한 점이 심심찮게 발견되어 수정의 수정을 거듭했다. 그렇게 3~4주를 보내고 나니 다음엔 무엇을 만들어볼까 하던 차에, 문득 떠오른 것이 있다. '무수히 많은 치킨 가게가 있고, 그 많은 메뉴들을 한 곳에서 모아보면 어떨까?' 그래서 프로젝트라고 하기엔 뭣하지만 원하는 작업을 구현해보며 모르는 부분이 있으면 배워가고, 알던 내용이 있으면 다시 되새기는 목적을 가지고 시도해보려 한다. 먼저 '푸라닭' 사이트에서 메뉴 정보들을 크롤링해 뿌려주는 식으로 시작해보고 결과가 괜찮으면 다른 브랜드들도 시도해보는 식으로 점차 넓혀가겠다. * 저번 포스팅에서 푸라닭 사이트에서 제공하는 메뉴들의 모든..