실행 - DB연동까지
vue로 만들어서 배포할때도 static에 넣는다고 한다.
CM 이라고 함. 폴더 세개 생성
4-1. HomeController.java
: @Controller
= 컨트롤러 파일임을 명시함
: 크롬에서 입력한 주소가 일치하면 메소드가 실행
: value
의 속성은 String[]
= 배열형식
: 여기에서는 "/"와 "home" 모두 홈화면을 리턴하게 만듦
: application.properties 에서 설정한 templates 위치에 있는 home.jsp 파일을 리턴(불러와서 표시)함
: 확장자명도 설정했기떄문에 생략가능
4-2. Boot20220228Application.java
: 임의로 만든 컨트롤러의 위치를 지정
: @ComponentScan(basePackages = { "com.example.controller" })
4-3. 실행파일(Boot20220228Application.java)은 모든 @Controller
가 붙은 컨트롤러 파일을 검토함
: 컨트롤러 파일이 여러개라면 다 검토를 함
: 대신 같은 주소명을 사용하면 안됨 (value에 들어가는 주소)
구동
@ComponentScan(basePackages = { "com.example.controller", "com.example.service" })
@SpringBootApplication
// 임의로 만든 컨트롤러의 위치를 지정
// 임의로 만든 서비스의 위치를 지정
@ComponentScan(basePackages = { "com.example.controller", "com.example.service" })
public class Boot20220228Application {
public static void main(String[] args) {
SpringApplication.run(Boot20220228Application.class, args);
System.out.println("Hello World!");
}
}
컨트롤러 파일임을 명시함
: @Controller
이 컨트롤러는 공통적으로 "/member" 아래에 주소를 만든다.
: @RequestMapping(value = "/member")
/member 라는 주소가 생략되어도 사용 가능함
: @GetMapping(value = { "/insert" })
= 127.0.0.1:8080/member/insert
리턴값은 파일명으로
POST
5-1. DB연동을 위해 설계도면을 가져옴
: 설계도면 = MemberDB.java
: @Autowired
= 설계도 가져오는 명령어
: private MemberDB memberDB;
= 설계도는 MemberDB라는 정의
5-2. POST는 사용자가 입력한 내용이 전달되고 DB 작업을 위해서 필요한 시점
5-3. POST로 맵핑한다
: @PostMapping(value = { "/insert" })
: 이렇게 되면 GET과 크롬상에서는 같은 주소지만 수행하는 명령이 POST로써 차이가 있다.
: jsp를 표시하는게 아니라 주소창에 입력후 엔터키를 누르는 효과가 있다.
5-4. 모델잡아서 한번에 압축해서 entity로 보냄
: 화면의 name과 Member.java의 변수명이 일치해야함
: @ModelAttribute Member member) {
5-5. 4.에서 가져온 도면의 메소드를 수행할 것을 명령
: memberDB.insertMember(mem);
: 실제 수행은 MemberDBImpl.java
5-6. 리턴값은 화면을 표시하는 GET과 다르게 새로고침의 느낌으로 한다.
: 주소창에 /member/insert 를 쓰고 엔터키를 누른것 처럼
: 이렇게 되면 POST가 아닌 GET이 작동한것이 되어 입력값을 불러오는 현상이 없고, insert 페이지가 새로 열린 것과 같은 효과가 난다.
@RequestMapping(value = "/member")
@Controller
public class MemberController {
@Autowired
private MemberDB memberDB;
// 127.0.0.1:8080/member/insert
@GetMapping(value = { "/insert" })
public String insertGET() {
// 폴더명/파일명
// 확장자명 생략
// 처음 화면 띄우는 명령
return "member/insert";
}
@PostMapping(value = { "/insert" })
public String insertPOST(
@ModelAttribute Member mem) {
System.out.println(mem.toString());
memberDB.insertMember(mem);
return "redirect:/member/insert";
}
}
@Service
insertMember(Member member);
public Member
@Service
public interface MemberDB {
public Member insertMember(Member member);
}
@Service
implements MemberDB
spring.data.mongodb.uri=mongodb://id201:pw201@1.234.5.158:37017/db201
spring.data.mongodb.database=db201
@Autowired
= mongoDB사용 선언private MongoTemplate mongodb;
= 사용변수 설정mongodb.insert(member);
@Service
public class MemberDBImpl implements MemberDB {
// public MemberDBImpl() {
// 연동
// 원래 이렇게 함
// }
// 환경설정으로 생성된 객체
// application.properties 여기에서 설정한 mongodb 설정
@Autowired
private MongoTemplate mongodb;
// implement 이후 Override
@Override
public Member insertMember(Member member) {
try {
// Member.java에서 컬렉션 정해둠
// T = 내가 만든걸로 넣음
// T로 리턴
return mongodb.insert(member);
// 여기에서 만든것을 컨트롤러에서 사용할수있도록만 하면 됨
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap.css}" />
<script type="text/javascript" th:src="@{/js/bootstrap.min.js}"></script>
<form>
사용<form th:action="@{/member/insert}" method="post">
아이디 : <input type="text" name="id" /> <br>
암호 : <input type="password" name="pw" /> <br>
암호확인 : <input type="password" name="pw1" /> <br>
이름 : <input type="text" name="name" /> <br>
나이 : <input type="text" name="age" /> <br>
<input type="submit" class="btn btn-primary" value="회원가입">
</form>