1. 3가지 종류 1. 정적 컨텐츠 서버에서 하는 것 없이 파일을 웹 브라우저로 그대로 내려준다. 2. MVC와 템플릿 엔진 jsp, php는 템플릿 엔진이다. 서버에서 프로그래밍해서 html을 동적으로 바꿔서 내리는 방식을 템플릿 엔진이라고 한다. 위 동작을 실행하기 위해 model, controller, view를 이용하는 것이 MVC 방식이다. 3. API json이라는 데이터 포맷으로 클라이언트한테 데이터를 전달한다. json은 java script object notation의 약자이다. 직역하면 자바스크립트 객체 표기법으로 데이터를 쉽게 교환하고 저장하기 위한 텍스트 기반의 데이터 교환 표준이다. 2. 동작 방식의 차이 1. 정적 컨텐츠 2. MVC와 템플릿 엔진 view : 화면을 그리는 일..
1. build 위치로 이동 https://start.spring.io/ 위 경로에서 프로젝트를 생성하고, sts나 인텔리제이를 통해 수정했다. 프로젝트 위치는 Download에 두었다. cd Download/hello-spring 2. 빌드한다. ./gradlew build 여기서 빌드란? 소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 그 결과를 말한다. 예를 들어 자바 프로젝트를 진행한다면 개발자가 작성한 A.java와 여러가지 정적 파일 등에 해당하는 resource가 존재한다. 빌드를 한다면 1) 소스코드를 컴파일해서 .class로 변환하고 2) resource를 .class에서 참조할 수 있는 적절한 위치로 옮기고 3)META-INF와 MANIFEST.NF들을 하나..
1. 문제 상황 A problem occurred configuring root project 'backend'. > Could not resolve all files for configuration ':classpath'. > Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.10. Required by: project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.0.10 > No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.10 was found. The..
AOP를 이용해보려고 @Aspect 어노테이션 방식을 사용해보려 했는데, 이렇게 빨간줄만 뜨고, 무엇을 import하면 좋을지 안내해주지도 않는다. org.aspectj aspectjweaver 1.9.8 runtime org.aspectj aspectjrt 1.9.8 runtime 심지어 pom.xml에 depencies로 AOP 사용을 위한 aspectj도 모두 추가되어 있는 상태이다. 이럴 땐 runtime을 지워보자. org.aspectj aspectjweaver 1.9.8 org.aspectj aspectjrt 1.9.8 지우고 나서 다시 마우스 커서를 위로 둬보면 import 패키지를 제시해준다. 그 이유는? [Spring] AOP의 ProceedingJoinPoint가 import가 안되는 ..
오늘의 의문을 하나의 이미지로 표현하자면 이것이다... 책 등록 form에서 넘기는 값들이 모두 null로 넘어가고, 맨 뒤 파일도 null로 넘어간다는 점이다. 한참을 헤매다가 혹시 몰라 enctype="multipart/form-data"을 빼고, 파일 input도 제거해보았는데, 그건 잘 넘어갔다. 그제서야 불연듯이 깨달았다. 수문장(servlet-context.xml)에 CommonsMultipartResolver를 알리지 않았다는 것을... 🌱 Spring MVC (15) 파일 업로드1 (Multipart/form-data, MultipartFile) 🔎 Multipart/form-data velog.io 이 분께서 하시는 말씀처럼 일반적으로 form태그는 application/x-www-for..
만약 로그인하지 않은 회원은 글 등록을 못하게 하고 싶다고 가정한다. [header.jsp] 안녕하세요 ${loginUser.name}님 로그아웃 모든 페이지 상단은 동일하기 때문에 중복해서 코드 칠 필요없이 header.jsp에 하나로 적어 모든 페이지에 적용하는 방식으로 진행한다. header.jsp를 메인 페이지에 적용한다. [index.jsp] 도서 등록 도서 목록 를 이용해 메인페이지에 header.jsp를 적용한다. 로그인 안 한 회원의 경우 도서 등록을 못하게 막을 것이다. => 때문에 HandlerInterceptor 인터페이스를 구현할 SessionInterceptor 클래스를 만들어 줄 겁니다. [SessionInterceptor.java] @Component public class S..
만약 도서 정보를 받는 간단한 페이지가 있다고 가정해보자. 도서 등록 도서번호 도서명 저자 도서번호, 도서명 저자 모두 쓰지 않으면, 파라미터 입력값이 덜 들어왔다고 띄워주고 싶다. 그럼 일단 form에 적힌대로 컨트롤러에 post방식의 regist주소의 요청이 오면 기능할 수 있는 곳을 찾아준다. => @PostMapping("regist") @PostMapping("regist") public String doRegist(Book book, Model model) throws BindException { if(book.getIsbn().equals("")||book.getTitle().equals("")||book.getAuthor().equals("")) { throw new BindExceptio..