<!DOCTYPE html>
<!--
xmlns:th
: 타임리프의 th 속성을 사용하기 위한 네임스페이스로 html 태그의 속성으로 작성한다.
-->
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1 align="center">표현식</h1>
<h2>주석</h2>
<!--
주석의 종류
parser-level 주석
: 정적 페이지에서 주석으로 있다가 thymeleaf가 처리 될 때 제거되어
클라이언트에게 노출되지 않는 주석
prototype-only 주석
: 정적 페이지에 주석으로 있다가 thymeleaf 처리 후에
화면에 보여지게 되는 주석
-->
<ul>
<li>parser-level 주석</li>
<!--/* 주석내용 */-->
<li>prototype-only 주석</li>
<!--/*/ 주석내용 /*/-->
</ul>
<h2>표현식1 - 변수 표현식 ${...}</h2>
<p th:text="${ param.title }"></p>
<p th:text="${ param.no[0] }"></p>
<p th:text="${ param.no[1] }"></p>
<!-- <p th:text="${ param.no[2] }"></p>
parameter로 넘어온 경우는 param, session attribute일 경우는 session,
model에 담겨 온 경우는 따로 적지 않음(request라고 적으면 에러)
파라미터가 존재하지 않으면 무시하지 않고 에러 발생함
-->
<h2>표현식2 - 메세지 표현식 #{...}</h2>
<!-- resources 폴더 하위에 messages.properties
라는 외부 리소스를 읽어온다. -->
<p th:text="#{ message.first }"></p>
<p th:text="#{ message.second(everyone) }"></p>
<h3>표현식3 - 링크 표현식 @{...}</h3>
<a th:href="@{/}">메인으로</a>
<a th:href="@{/(name=${member.name},age=${member.age})}">Test1</a>
<a th:href="@{/{name}/{age}(name=${member.name},age=${member.age})}">Test2</a>
<a th:href="@{/{name}(name=${member.name},age=${member.age})}">Test3</a>
</body>
</html>
application.yml
server:
port: 8001
messages.properties
message.first=hello world
message.second=hello {0}
package com.greedy.crud.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Chap01BootCrudApplication {
public static void main(String[] args) {
SpringApplication.run(Chap01BootCrudApplication.class, args);
}
}
ContextConfiguration
package com.greedy.crud.config;
public class ContextConfiguration {
}
MybatisConfig
설정 파일을 넣을 config 패키지 하위에 작성하도록 한다.
Chap01BootCrudApplication은 기본 시작되는 클래스이므로 이곳에 직접 작성하는 것보다 MybatisConfig 클래스를 따로 작성하여 필요한 설정 파일등을 추가하는 것이 좋다.
MapperScan에 있어서 "com.greedy.crud"까지만 작성하게 될 경우 crud 하위의 모든 인터페이스를 대상으로 매퍼로 간주되고 구현체를 생성해달라는 의미가 된다. 매퍼가 아닌 인터페이스는 따로 건들지 않도록 세부 작성이 필요하다.
모든 인터페이스를 모두 매퍼로 설정할 것은 아니기 때문이다.
package com.greedy.crud.config;
import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan(basePackages
= "com.greedy.crud", annotationClass = Mapper.class)
public class MybatisConfig {
}
MenuController
package com.greedy.crud.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.greedy.crud.model.service.MenuService;
@Controller
@RequestMapping("/menu")
public class MenuController {
private MenuService menuService;
@Autowired
public MenuController(MenuService menuservice) {
this.menuService = menuService;
}
}
interface MenuMapper
@Mapper는 인터페이스를 위한 mark이다.
dao에 해당하는 것을 직접 만들지 않아도 된다. 마이바티스 스프링에서 매퍼 스캔기능 이용시 인터페이스만 만들어 놓고 mapper.xml을 만들었을때, 중간에 자동으로 호출해주는 구현체는 프록시를 이용해 자동생성 될 것이다.
그러므로 이와같이 @Mapper 를 통해 crud하위의 매퍼를 스캔 해 프록시로 MenuMapperImpl.java 를 생성하는 작업까지는 된 것이다.
여기서 추가로 -Impl이 호출할 대상이 어떤 경로에 있는지 매퍼를 등록하는 설정이 필요하다. 이를 application.yml에 작성하도록 한다.
package com.greedy.crud.model.dao;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MenuMapper {
}
Lombok
DTO/VP 클래스의 constructor, getter/setter, toString 등을 어노테이션을 통해 자동 작성해 줄 수 있는 기능을 가진다.
필드 수정 후 해당 코드에 대한 수정작업이 필요 없다는 장점이 있다.
편리하지만 구조와 무관한게 남용될 수 있어 프로젝트에 따라 사용하지않는 경우도 있음에 유의한다.
팀 프로젝트에서 활용 시 모든 팀원이 해당 라이브러리를 설치한 환경에서 사용해야 한다.
Lombok 설치 방법 :
의존성 추가 후 라이브러리 설치
해당 jar 파일이 위치한 폴더에서 cmd 창으로 -java lombok-버전.jar 실행
sts.exe 선택해서 install / update 후 sts 재부팅
MenuDTO
@Data는 위 주석처리된 모든 어노테이션을 한번에 생성할 수 있다.
단, @AllArgsConstructor는 제외이다.
편리하기는 하지만 최소한의 필요한 것들만 추가하는 방향으로 롬복을 사용하는 것이 바람직하다.
@Data를 만능키로 사용하지 않도록 한다.
package com.greedy.crud.model.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
//@NoArgsConstructor
//@AllArgsConstructor
//@Getter
//@Setter
//@ToString
//@EqualsAndHashCode
@Data //매개변수 생성자를 제외하고 위의 내용을 한번에 처리할 수 있는 어노테이션
public class MenuDTO {
private int code;
private String name;
private int place;
private int categoryCode;
private String orderableStatus;
}
MenuService
package com.greedy.crud.model.service;
public class MenuService {
}
MenuServiceImpl
원칙대로라면 인터페이스를 구현해야하지만 확인이 목적이므로 편의를 위해 빈 클래스를 만들어준다.
package com.greedy.crud.model.service;
public class MenuServiceImpl {
}
MenuMapper.xml
dtd를 작성하기위해 다음과같은 경로를 참고할 수 있다.
이클립스 메뉴의 help - marcket place - mybatis 검색 후 - mybatis 1.25 설치
도커 이미지를 생성할 수 있는 설정 파일 사용자가 이미지를 조합하기 위해 명령 줄에서 호출할 수 있는 모든 명령을 포함하는 텍스트 문서 완성된 이미지를 생성하기 위해 필요한 컨테이너, 패키지, 소스코드, 명령어 등을 하나의 파일에 기록 도커에서 이 파일을 읽어 자동으로 작업을 수행한 뒤 완성된 이미지 로 만들어 줌 깃과 같은 개발도구를 통해 애플리케이션의 빌드 및 배포를 자동화 할 수 있음
도커 이미지 생성 방법 1
기존 이미지로 컨테이너 생성 후 작업 완료된 컨테이너를 다시 이미 지로 생성
도커 이미지 생성 방법 2
Dockerfile로 필요한 패키지, 소스코드, 명령어 등을 작성 후 빌드
Tomcat 공식 이미지 Dockerfile 확인 Docker hub tomcat 이미지 검색 시 태그별 Dockerfile을 볼수있는 경로를 제공해 줌
Dockerfile 작성
컨테이너에서 수행해야 할 작업을 명시 정해진 형식과 명령어로 작성해야 함 문서 파일로 작성 한 줄에 하나의 명령어로 구성 명령어를 명시하고 뒤에 옵션을 추가 명령어는 대/소문자 상관없음(일반적으로 대문자로 표기) 위에서 아래로 한 줄씩 차례대로 실행됨 주석은 # 기호를 사용
Dockerfile 명령어
Dockerfile 작성 예제 ① D:\DockerWeb 디렉터리 생성 ② ROOT.war 파일 DockerWeb 디렉터리에 저장 ③ Dockerfile 작성 후 저장
[Dockerfile]
# 베이스 이미지를 tomcat:8.5.72-jdk8로 지정 FROM tomcat:8.5.72-jdk8 # 작성자 라벨 생성 LABEL maintainer "kh<kh@iei.com>“ # 버전 라벨 생성 LABEL version="1.0“ # /usr/local/tomcat/webapps 디렉터리에 ROOT.war 파일 추가 ADD ROOT.war /usr/local/tomcat/webapps # Timezone 환경변수를 Asia/Seoul로 변경 ENV TZ=Asia/Seoul # 이미지에서 8080포트 사용 EXPOSE 8080 # 컨테이너 실행 시 catalina.sh 파일 자동 실행 CMD ["catalina.sh","run"]
Dockerfile 빌드 작성한 Dockerfile을 이용해 이미지를 생성하는 과정 docker build [옵션] <Dockerfile이 존재하는 디렉터리 경로>
DockerFile 다루기
Dockerfile 빌드
> docker build –t mytomcat:1.0 d:\DockerWeb
생성된 이미지 상세 정보 보기
> docker inspect mytomcat:1.0
생성된 이미지로 컨테이너 실행
docker run -d --name myweb2 -p 81:8080 --link mydb:db mytomcat:1.0