domain 폴더를 만들고 그 안에 Member모델을 작성해줄 클래스를 선언합니다.여기서는 Member에 대해 아이디,이름 2가지를 만들고 각각에 대한 getter,setter를 만들어 줍니다.여기까지는 그렇게 어렵진 않았다. 다만 그동안 JAVA를 배울 때는 Long
개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 자바는
Model은 HashMap 형태를 갖고 있으며, Key,Value값을 가지고 있습니다.addAttribute()와 같은 기능을 통해 모델에 원하는 속성과 그것에 대한 값을 주어 전달할 뷰에 데이터를 전달할 수 있습니다.👉addAttribute는 Map의 put과 같은
프로그램을 보다 쉽고 빠르게 만들게 하는 도구입니다.햄버거 가게 알바부터 해서 레시피를 배우고 소님 응대하는 법 등등 차근차근 하나씩 배워가야겠죠.근데 문제는 이 시간들을 줄이고 싶다는 겁니다. 여러 시행착오를 최소화 해서 더 빠른기간내로 빠른 내로 오픈하고 싶다는것이
웹 서비스는 클라이언트와 서비스의 요청과 응답으로 동작합니다.클라이언트란 서비스를 사용하는 프로그램 또는 말합니다.서버는 서비스를 제공하는 프로그램 또는 컴퓨터를 의미합니다.브라우저가 클라이언트로써 동작을하고 스프링 부트는 서버의 역할을 합니다.우선 브라우저를 키고 l
웹페이지에 변수를 활용하는 뷰 템플릿, 분야별 담당자를 나누는 MVC패턴뷰 템플릿이란 화면을 담당하는 기술입니다.웹페이지가 하나의 틀로 만들로 변수를 삽입하게 합니다.다시말해 틀이 되는 페이지가 변수의 값에 따라서 수많은 페이지로 바뀔수 있습니다.mustache 란 도
<form>태그에 어디로 보낼지 , 어떻게 보낼지를 적혀진 대로 데이터는 전송이되고 컨트롤러 이는 객체를 담아서 받습니다.이떄 폼데이터를 받는 객체 이를 DTO라고합니다.resources->template->새로운 Directory 생성 ->new.mustache
DB는 JAVA언어를 모릅니다. DB는 SQL이라는 언어를 사용합니다.(따라서 JAVA를 이해하지못합니다.)그래서 이를 위한 도구가 JPA입니다. 자바언어를 DB가 이해할 수 있게 할 뿐만아니라 데이터 관리에 편리한 기능을 제공합니다.핵심 도구로는 Entity,Repo
src-> main -> resources ->application.properties 프로젝트에 관한 여러 설정들을 입력할 수 있습니다.이 데이터베이스를 웹 콘솔로 접근 가능하게 해주는 설정값 입니다.서버 재시작여기서 JDBC URL 주소는 command+F 를 통해
Lombok을 활용하여, 기존 코드를 "리팩터링" 해보기 1. Lombok이란? 코드를 간소화 시켜주는 라이브러리 입니다. 개발을 하다보면 게터,세터,생성자 등등 이런 필수 메서드들을 반드시 사용하기 마련인데 이를 매번 작성하는게 만만치 않습니다. 그래서 나온 도구가
이런식으로 1번 아이디, 2번 아이디, 3번 아이디가 있습니다.예를들어 1번 아이디를 갖고 있으면 articles/1, 3번아이디를 갖고있으면 articles/3 이런식으로 URL요청을 받아 보도록 하겠습니다.다시 ArticleController 클래스에 와서 @Get
DB속 모든 Article을 목록으로 조회해봅니다. 1.URL요청 받기 localhost:8080/articles 를 브라우저에서 요청 받으면 article을 목록으로 볼수있도록 틀을 만듭니다. 모든 article을 가져올것이기에 레파지토리에서 findAll()메서
Link >미리 정해놓은 요청을 간편히 전송하는것 HTML의 `,` 태그 등을 이용하여 작성할 수 있습니다. ![](https://images.velog.io/images/jyyoun1022/post/b799592a-77ef-4767-97c0-bd6d5d34930
상세 정보의 뷰 템플릿은 view.mustache입니다.이제 여기에 <a>태그를 넣어 링크를 만들어 주겠습니다./articles/id/edit 이라고 넣고 싶은데 위의 article의id를 써야 하므로 article.id라고 입력합니다.class="btn btn-
수정을 했을 떄 에러 페이지가 나오는게 아닌 수정된 페이지가 나오게 만들어봅니다.서버를 껏다 켰다 할 일이 많은데, 더미데이터를 자동으로 생성할 수 있게 코드를 작성합니다.resources에 새로운 파일 data.sql이라는 파일을 만들어 줍니다.만든 후에 INSERT
상세페이지인 show.mustache에서 삭제 버튼을 만들겠습니다.EDIT버튼과 똑같이 만들어 준 뒤 URL을 바꿔줍니다.버튼이 잘 나오게 되었네요@DeleteMapping을 쓸 수 도 있지만 HTML에서 정식지원하지 않기 때문에 @GetMapping을 쓰겠습니다.삭제
resources -> application.propertieshibernate.SQL이 새로 등록 된것을 볼 수 있습니다.이쁘게 보이기쿼리가 포멧이 잡혀서 잘 출력되는 것을 확인 할 수 있습니다.쿼리를 던지다보면 ?같은 것을 볼 수 있습니다 ?값에 어떤 변수값이 담겨
웹서버의 자원을 클라이언트에 구애받지 않고 사용할 수 있게 하는 설계 방식으로써,HTTP를 통해 서버의 자원을 다루게 하는 기술입니다.이때 서버의 응답은 모든 기기에 통용될 수 있는 화면이 아닌 데이터만을 반환합니다.이러한 응답 데이터는 과거의 xml형식으로 사용되었지
컨트롤러와 레파지토리의 사이에 위치하는 계층으로써 처리 업무의 순서를 총괄합니다.음식점을 예로 들면 웨이터에게 주문이 들어오면 이를 전달받은 쉐프가 요리를 총괄합니다. 이때 요리에 필요한 재료는 보조 요리사에게 가져오게 시킵니다.여기서 웨이터는 Controller, 쉐
repository package실제로 DB에 접근하는 객체이다.\-Persistence Layer(DB에 data를 CRUD하는 계층)입니다.Service와 DB를 연결하는 고리의 역할을 합니다.SQL을 사용(개발자가 직접 코딩)하여 DB에 접근한 후 적절한 CRUD
웹 사이트를 이용하여 게시판을 둘러볼 때, 게시글 목록 하단에 게시글을 일정 수로 나누어 페이지화 시켜놓은것을 볼 수 있는데 이를 pagination(페이지네이션)이라고 합니다.pagination을 구현하기 위해서는 현재 페이지번호,각 페이지별 보여질 내용의 수, 페이
Controller의 메서드는 Model이라는 타입의 객체를 파라미터로 받을 수 있습니다.순수하게 JSP Servlet으로 웹 어플리케이션을 만들 때 보통 request나 session 내장객체에 정보를 담아 JSP에 넘겨주곤 했는데 Spring에서는 Model이라는
스프링은 @transactional 어노테이션을 이용한 선언적 트랜잭션 처리를 지원합니다.트랜잭션은 우리말로 '거래'라는 뜻일 갖고 있습니다.먼저 거래와 관련된 간단한 예시를 생각해 보겠습니다.내가 어떤 사람과 거래를 하고 있는 상황인데, 물건을 받기 위해 상대방에게
1. SRP : 단일 책임 원칙 >Single responsibility priciple 한 클래스는 하나의 책임만 가져야 합니다. 하나의 책임이라는 것은 모호하다. -클 수도 있고, 작을 수 있습니다. -문맥과 상황에 따라 다릅니다. 중요한 기
의존관계 주입은 크게 4가지 방법이 있습니다.1\. 생성자 주입2\. 수정자 주입(setter 주입)3\. 필드 주입4\. 일반 메서드 주입이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법입니다.생성자 호출시점에 딱 1번만 호출되는 것이 보장됩니다.👉한번만 호
@RequestMapping에서 value 표기하지 않기!@ReponseBody로 응답이 뷰를 거치지 않고 바로 웹브라우저로 이동하게 합니다.@RequestMapiing에서 파라미터가 1개(URL지정)만 있다면 value를 생략할 수 있습니다.http://lo
@ModelAttribute : 프론트에서 백단으로 데이가 올때 사용합니다.(주로 수정,등록에 쓰입니다.)파라미터에 Model 객체 생성 : 백단에서 프론트단으로 데이터를 옮기고 싶을 때는 model.addAttribute를 사용해줍니다.@RequestParam은 단일
@ResponseBody 가 없으면 response/hello 로 뷰 리졸버가 실행되어서 뷰를 찾고, 렌더링 합니다.@ResponseBody 가 있으면 뷰 리졸버를 실행하지 않고, HTTP 메시지 바디에 직접 response/hello 라는 문자가 입력됩니다.여기서는
VO(Value Object) 개념 Value Object는 DTO와 동일한 개념이지만 차이점은 read only속성을 갖습니다. Value Object는 관계 데이터 베이스의 레코드에 대응되는 자바 클래스 입니다. 형태는 DB 레코드를 구성하는 필드들을 Value O
1. Presentation Layer : View 표현과 이벤트 처리, 데이터 포멧 책임 사용자와의 최종 접점에 위치하여 사용자로부터 데이터를 입력 받거나, 요청된 데이터를 출력해 보이는 계층입니다. 외부로부터의 어플리케이션에 대한 요구를 받아들이는 동시에 처리 결
스프링 부트로 파일을 업로드 하는 것은 아주 단순한 설정만으로도 가능합니다.스프링 부트의 파일 업로드와 관련된 설정은1) 별도의 파일 업로드 라이브러리(commons -fileload)등을 이용하는 경우,2) Servlet 3 버전부터 추가된 자체적인 파일 업로드 라이
스프링 부트로 파일을 업로드 하는 것은 아주 단순한 설정만으로도 가능합니다.스프링 부트의 파일 업로드와 관련된 설정은1) 별도의 파일 업로드 라이브러리(commons -fileload)등을 이용하는 경우,2) Servlet 3 버전부터 추가된 자체적인 파일 업로드 라이
스프링 부트로 파일을 업로드 하는 것은 아주 단순한 설정만으로도 가능합니다.스프링 부트의 파일 업로드와 관련된 설정은1) 별도의 파일 업로드 라이브러리(commons -fileload)등을 이용하는 경우,2) Servlet 3 버전부터 추가된 자체적인 파일 업로드 라이
정상적인 사이즈의 이미지 파일이라면 업로드가 처리되지만 아직 브루우저에는 아무런 결과가 반영되지 않았습니다. 결과 데이터는 JSON으로 전송할 것이므로 어떤구조의 데이터를 전송할 것인지 결정해야 합니다. 브라우저에서 필요한 정보 -업로드된 파일의 원래이름 -파일의 U
JSON으로 반환된 업로드 결과를 화면에서 확인하기! 브라우저에서 링크를 통하여 ``태그를 추가해줘야 하고, 서버에서는 해당 URL이 호출되는 경우에 이미지 파일 데이터를 브라우저로 전송해 주어야 합니다. 이 작업들을 처리하기 위해서 UploadController에는
이미지가 정상적으로 업로드 처리가 되었지만, 원본 이미지가 그대로 나오면 데이터를 많이 소비하기 때문에 가능하면 섬네일을 만들어서 만들어서 전송해주고 원본을 보려고 할 때 원본 파일을 보여주는 방식이 더 좋습니다.(특히 목록 페이지는 이미지가 많아지므로 주의해야 합니다
업로드된 파일의 삭제는 파일의 URL로 쉽게 처리할 수 있습니다.파일의 URL 자체가 '년/월/일/uuid\_파일명'으로 구성되어 있으므로 이를 활용하여 삭제할 파일의 위치를 찾아서 삭제할 수 있습니다.UploadController에서는 removefile() 메서드를
파일 업로드로 영화를 등록하고, 사용자들이 영화 리뷰를 기록하는 것을 예제로 작성해봅니다.영화의 등록과 수정에는 파일 업로드 기능을 활용하여 영화 포스터 등을 등록할 수 있도록 구성합니다.회원은 기존 회원들이 존재한다고 가정하고 데이터베이스에 존재하는 회원들을 이용합니
이미지 파일의 삭제는 앞쪽에서 다뤄본 적이 있으므로 유사하게 처리하면 됩니다.\-달라지는 것은 <div>가 아니라 <li>라는 점입니다.삭제가 잘 되었음을 알수 있습니다.\-화면에서 'Submit' 버튼을 클릭하면 다음과 같은 작업을 처리합니다.\-각 이미
목록 처리와 평균 평점 등록 처리가 완료 되었더라면 목록 페이지를 제작합니다. 목록 페이지에는 영화의 제목과 이미지 평균 평점을 화면에 출력해야만 합니다. 예제에서 사용했던 PageRequestDTO 와 PageResultDTO를 dto패키지에 추가해줍니다. Movi
조회 페이지는 실제 영화 리뷰가 진행되는 공간이므로 많은 기능이 추가되어야 합니다.영화 리뷰와 관련된 기능은 Ajax로 처리해서 작성합니다.조회 페이지는 목록 페이지에서 영화의 번호를 클릭하면 이동하는 '/movie/read'URL을 처리해야 합니다.MovieServi
사용자는 버튼을 클릭해서 영화 리뷰를 할 수 있는 모달창을 보게 됩니다.모달창에는 별점(점수)을 줄 수 있도록 화면을 구성해서 회원의 아이디와 리뷰 점수,내용을 입력하게 합니다.영화 리뷰가 등록되면 영화 자체의 리뷰 개수와 평균이 변경되었기 때문에 아에 현재 URL을
전통적인 ID/PW 기반의 로그인 처리를 학습합니다.스프링 시큐리티는 다양한 방식으로 사용자 정보를 유지할 수 있는 방법을 제공합니다.이번 장에서는 흔히 '세션(HttpSession)'기반의 예제로 사용자 정보는 서버에서 보관하고, 필요한 경우에 설정을 통하여 제어하도
CSRF설정 스프링 시큐리티는 기본적으로 CSRF(Cross Site Request Forgery-크로스 사이트 요청 위조)라는 공격을 방어하기 위해서 임의의 값을 만들어서 이를 GET 방식을 제외한 모든 요청 방식에 포함시켜야만 정상작동이 가능합니다. CSRF공격은
문득 공부하다가 의문점이 들었습니다. 파일업로드하는데 DTO에 왜 Serializable 을 구현하는 이유가 뭘까?자바책에는 객체를 파일에 저장하거나 파일에서 꺼내오기 위해서 또는 객체를 네트워크를 통해 전송하기 위해서는 미리 객체를 직렬화해야 한다고 되어 있습니다.웹
프로젝를 위한 JPA처리 프로젝트에 스프링 시큐리티를 적용하기 위해서는 당연히 이에 맞는 데이터베이스 관련처리가 필요합니다. 예제는 아이디 대신에 최근에 소셜 로그인에서 많이 사용하는 이메일을 아이디로 구성해서 회원을 처리합니다. 회원정보는 다음과 같이 구성합니다. -
스프링 시큐리티에서는 회원이나 계정에 대해서 User라는 용어를 사용합니다.User라는 단어를 사용할 때는 상당히 주의해야 합니다. 이러한 이유 때문에 앞의 예제에서도 ClubMember와 같이 다른 이름을 사용하고 있습니다.회원 아이디라는 용어 대신 username이
싱글톤 클래스 빈을 생성하는 어노테이션입니다.@Service,@Repository 어노테이션 또한 이에 포함됩니다.이 어노테이션은 선언적인 어노테이션입니다.즉 패키지 스캔 안에 이 어노태이션은 "이 클래스를 정의했으니 빈으로 등록해줘"라는 뜻이 됩니다.@Bean은 주로
스프링 MVC의 구조가 기존의 상속과 인터페이스에서 어노테이션을 사용하는 방식으로변한 이후에 가장 큰 변화 중 하나는 리턴 타입이 자유로워 졌다는 점입니다.String : jsp를 이용하는 경우에는 jsp파일의 경로와 파일이름을 나타내기 위해서 사용합니다.void :
Character DATA, 즉 문자열 데이터를 말한다.<!\[CDATA\[ ]]> 이렇게 선언한 후에 안에 문자열을 채워 넣으면, \[] 안에 있는 문자는 파싱되지 않고 그대로 문자열로 출력됩니다.MyBatis에서 mapper 파일은 XML로 작성되어 있고 파싱
Mysql로 페이징 처리하는데 공식이 있어서 메모해봅니다.Criteria클래스에 getSkip()메서드를 생성해주어 만약 PageNum이 2이고 size가 10이라고한다면, getSkip()의 리턴값은 (2-1)\*10가 되어 10이됩니다.따라서 쿼리를 작성할 때 li
Mapping을 할 때 받고싶은 데이터를 강제 함으로써 오류 상황을 줄일 수 있습니다.이를 위해 사용하는 것 중 하나가 Media Types입니다.들어오는 데이터와 나가는 데이터를 정하여 처리할 수 있습니다.여기서 consumes는 들어오는 데이터 타입을 정의할 때 이
스프링 컨테이너에 빈을 등록하면 스프링 컨테이너가 알아서 의존관계를 맺어준다. 그런데 의존관계를 맺어줄 때 해당하는 타입의 빈이 2개 이상이라면 어떤 문제가 발생할까?간단한 예시로 알아보도록 하자.현재 MyRepository 인터페이스가 하나 있으며, 이를 구현하는 2
TDD가 중요하다는 말을 너무 많이들어서 이번 포스팅에서는 단위 테스트와 중요성 그리고 단위 테스트를 바탕으로 하는 TDD는 어떻게 프로그래밍하는 것인지 배워보도록하겠습니다.단위 테스트(Unit Test)를 작성해야 하는 이유코드를 수정하거나 기능을 추가할 때 수시로
1. TDD 연습문제 소개와 요구사항 분석 문제 설명 이번 연습 문제의 주제는 멤버십 적립 서비스입니다. 현재 지원중인 멤버십에는 네이버,카카오,라인 3가지 멤버십이 있으며, 사용자가 원하는 멤버십을 등록할 수 있습니다. 포인트 적립비율은 결제금액의 1%로 고정되
나의 멤버십 등록 API기능 : 나의 멤버십을 등록합니다.요청 : 사용자 식별값, 멤버십 이름, 포인트응답 : 멤버십 ID, 멤버십 이름앞서 포스팅에서 살펴봤던 것처럼 Repository의 메서드 중에서 멤버십을 DB에 추가하는 테스트 코드를 먼저 작성해보고자 합니다.
이번에는 멤버십을 등록하는 서비스 계층을 개발해야 합니다. 앞서 Repository 계층을 개발했던 것처럼 이번에도 다음과 같이 서비스 계층에 대한 테스트 클래스부터 작성해야 합니다.서비스 계층은 데이터베이스에 데이터를 처리하는 Repository 계층을 Mocking
Controller 계층 개발 컨트롤러 역시 다른 계층을 개발할 때와 마찬가지로 테스트 코드를 먼저 작성하도록 하자. 컨트롤러는 함수 호출이 아닌 API 호출을 통해 요청을 받고 응답을 처리해야 하며, 메세지 컨버팅 등과 같은 작업이 필요하다. 그러므로 MockMv
공부를 해보다가 메인클래스가 왜 SpringBootServletInitializer를 상속하고 있는 형태였다. 이것은 무엇이고 왜 상속받고 있는지 궁금해서 공부해 보았습니다.SpringBoot 웹 애플리케이션을 배포할 때는 주로 embedded tomcat이 내장된 j
@Transactional을 클래스 또는 메서드 레벨에 명시하면 해당 메서드 호출시 지정된 트랜잭션이 작동하게 됩니다.단, 해당 클래스의 Bean을 다른 클래스의 Bean에서 호출할 때만 @Transactional을 인지하고 작동하게 됩니다.default 값이기 때문에
그동안 JPA 로만 공부하다가 이번 팀원끼리 하는 사이드 프로젝트에서는 Mybatis를 사용하기로 하여 Mybatis 를 공부해보려고 합니다. 1. 게시판 테이블 생성하기 테이블의 생성 결과를 확인하는 방법은 SQL 콘솔창에 DESC tb_board ,SHOW
스프링 API(http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/util/UriComponentsBuilder.html페이징 처리를 하던중 동적으로 URI를 만들기 위해서
Spring 과 Mybatis를 이용하여 개발 할 때는 쿼리를 직접 작성하기 때문에 장단점이 있습니다. 쿼리를 직접 작성하면 쿼리를 튜닝하기도 좋고, 데이터를 원하는 형태로 조회하기가 쉬워집니다. 파일업로드를 하던 도중 게시판에 파일업로드를 해야하는데 board 의 P
구현 방법에 앞서 컨트롤러의 역할은 여러 형태의 클라이언트로 부터 요청을 받아 비즈니스 로직으로 전달하고 비즈니스 로직의 결과를 응답해주는 역할을 합니다.Restful한 api를 구현하기 위해 HTTP Methods 를 활용하여 API가 처리해야할 행위를 정의합니다.주
웹 소켓 프로토콜인 RFC 6455는 단일 TCP 연결을 통해 Client 와 Server 사이에 전이중 방향 통신(Full Duplex,2-way Communication)채널을 설정하는 표준화된 방법을 제공합니다.HTTP 환경에서, HTTP와는 다른 TCP 프로토콜
채팅 메시지에 대한 정보를 담는 클래스 : 채팅 내용에 대한 DTO채팅 내용은 크게 들어오는 사람에 대한 환영 메시지에 대한 ENTER과 방에 있는 사람들이 채팅을 칠 때 사용하는 TALK 두 가지로 메시지 타입을 나눕니다. 이때 타입은 ENUM으로 선언합니다.다음으로
STOMP는 Simple Text Oriented Messaging Protocol의 약자로 메시지 전송을 위한 프로토콜 입니다.기본적인 WebSocket 과 가장 크게 다른 점은 기존의 WebSocket 만을 사용한 통신은 발신자와 수신자를 Spring 단에서 직접
최근에는 애플리케이션을 개발할 때 테스트 코드로 로직을 확인하는 과정이 점점 더 중요하게 여겨지고 있습니다. 많은 개발자들이 어떻게 하면 테스트 코드를 더 잘 작성하고 활용할 수 있는지를 고민하고 있으며, 그 결과로 애자일 방법론 중 하나인 테스트 주도 개발(TDD ;
JUnit을 활용한 테스트 코드 작성 > JUnit은 자바 언어에서 사용되는 대표적인 테스트 프레임워크로서 단위 테스트를 위한 도구를 제공합니다. 또한, 단위 테스트 뿐만 아니라 통합 테스트를 할 수 있는 기능도 제공합니다. JUnit의 가장 큰 특징은 어노테이션 기반
이번에는 서비스 레이어에 해당하는 ProductService 객체를 테스트합니다.앞에서도 언급했듯이 예제에서는 DAO의 역할이 명확하게 드러나지 않기 때문에 DAO 객체는 생략합니다.먼저 getProduct() 메서드에 대해 코드를 작성해봅니다.단위 테스트를 수행할 클
TDD란 "Test-Driven Development"의 줄임말로 "테스트 주도 개발"이라는 의미를 가지고 있습니다.테스트 주도 개발은 반복 테스트를 이용한 소프트 웨어 개발 방법론으로써 테스트 코드를 먼저 작성한 후 테스트를 통과하는 코드를 작성하는 과정을 반복하는
@ExceptionHandler는 Controller 계층에서 발생하는 에러를 잡아서 메서드로 처리해주는 기능입니다.Service, Repository에서 발생하는 에러는 제외합니다.이와 같이 @Controller로 선언된 클래스 안에서 @ExceptionHandler