<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>나 Index야</h1>
<a href="/hello">Hello</a>
<a href="/members/memberForm">회원 가입</a>
<a href="/members/memberList">회원 목록</a>
</body>
</html>
package com.oracle.oBootHello.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.oracle.oBootHello.domain.Member1;
import com.oracle.oBootHello.service.MemberService;
@Controller
public class MemberController {
MemberService memberService = new MemberService();
@GetMapping(value = "members/memberForm")
public String memberForm() {
System.out.println("MemberController /members/memberForm Start...");
return "members/memberForm";
}
@PostMapping(value = "/members/save")
public String save(Member1 member1) {
System.out.println("MemberController /members/save Start...");
Long id = memberService.memberSave(member1);
System.out.println("MemberController /members/save id->"+id);
return "redirect:/";
}
}
package com.oracle.oBootHello.repository;
import java.util.HashMap;
import java.util.Map;
import com.oracle.oBootHello.domain.Member1;
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member1> store = new HashMap<Long, Member1>();
private static Long sequence = 0L;
@Override
public Member1 save(Member1 member1) {
member1.setId(++sequence);
store.put(member1.getId(), member1);
System.out.println("MemoryMemberRepository "+member1.getName());
return member1;
}
}
package com.oracle.oBootHello.repository;
import com.oracle.oBootHello.domain.Member1;
public interface MemberRepository {
Member1 save(Member1 member1);
}
- 일회성 Memory를 저장할 때는 보통 Map을 쓴다.
- private static Long sequence = 0L; -> Long 형으로 casting
package com.oracle.oBootHello.repository;
import java.util.HashMap;
import java.util.Map;
import com.oracle.oBootHello.domain.Member1;
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member1> store = new HashMap<Long, Member1>();
private static Long sequence = 0L;
@Override
public Member1 save(Member1 member1) {
member1.setId(++sequence);
store.put(member1.getId(), member1);
return member1;
}
}
package com.oracle.oBootHello.domain;
public class Member1 {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/members/save" method="post">
<label for="name">이름</label>
<input type="text" id="name" name="name" placeholder="이름을 입력하세요">
<button type="submit">등록</button>
</form>
</body>
</html>
package com.oracle.oBootHello.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.oracle.oBootHello.domain.Member1;
import com.oracle.oBootHello.repository.MemberRepository;
import com.oracle.oBootHello.repository.MemoryMemberRepository;
@Service
public class MemberService {
// 전통적
// MemberRepository(dao)랑 연결
// MemberRepository memberRepository = new MemoryMemberRepository();
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) { // component에 등록된 것이 들어옴
this.memberRepository = memberRepository;
}
// 회원 가입
public Long memberSave(Member1 member1) {
System.out.println("MemberService memberSave start...");
memberRepository.save(member1);
return member1.getId();
}
}
@Autowired - > @Service(bean)으로 연결되어 있어야 불러올 수 있다
package com.oracle.oBootHello.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.oracle.oBootHello.domain.Member1;
import com.oracle.oBootHello.service.MemberService;
@Controller
public class MemberController {
// 전통적
// MemberService memberService = new MemberService();
private final MemberService memberService; // final -> 생성자를 통해서만 들어오겠다.
// 생성자 주입으로 생성
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping(value = "members/memberForm")
public String memberForm() {
System.out.println("MemberController /members/memberForm Start...");
return "members/memberForm";
}
@PostMapping(value = "/members/save")
public String save(Member1 member1) {
System.out.println("MemberController /members/save Start...");
System.out.println("MemberController /members/save Start..."+member1.getName());
Long id = memberService.memberSave(member1);
System.out.println("MemberController /members/save id->"+id);
return "redirect:/";
}
}
@Repository(component) Bean으로 설정해주면 service는 이걸 작동시킨다
package com.oracle.oBootHello.repository;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.oracle.oBootHello.domain.Member1;
// component
@Repository
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member1> store = new HashMap<Long, Member1>();
private static Long sequence = 0L;
@Override
public Member1 save(Member1 member1) {
member1.setId(++sequence);
store.put(member1.getId(), member1);
System.out.println("MemoryMemberRepository sequence->"+sequence);
System.out.println("MemoryMemberRepository "+member1.getName());
return member1;
}
}
DI로 했을 때 결과 -> 동일하게 나옴
@GetMapping(value = "/members/memberList")
public String memberList(Model model) {
logger.info("memberList start...");
List<Member1> memberLists = memberService.allMembers();
model.addAttribute("memberLists", memberLists);
logger.info("memberLists.size()-> {}", memberLists.size());
return "members/memberList";
}
// 회원 목록
public List<Member1> allMembers() {
System.out.println("MemberService allMembers start...");
List<Member1> memList = null;
memList = memberRepository.findAll();
System.out.println("memList.size()-> "+memList.size());
return memList;
}
package com.oracle.oBootHello.repository;
import java.util.List;
import com.oracle.oBootHello.domain.Member1;
public interface MemberRepository {
Member1 save(Member1 member1);
List<Member1> findAll();
}
store.values()
package com.oracle.oBootHello.repository;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.oracle.oBootHello.domain.Member1;
// component
@Repository
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member1> store = new HashMap<Long, Member1>();
private static Long sequence = 0L;
// 회원가입
@Override
public Member1 save(Member1 member1) {
member1.setId(++sequence);
store.put(member1.getId(), member1);
System.out.println("MemoryMemberRepository sequence->"+sequence);
System.out.println("MemoryMemberRepository "+member1.getName());
return member1;
}
// 회원목록
@Override
public List<Member1> findAll() {
System.out.println("MemoryMemberRepository findAll start...");
// store의 value(Member1)
List<Member1> listMember = new ArrayList<Member1>(store.values());
System.out.println("MemoryMemberRepository findAll listMember.size()->"+ listMember.size());
return listMember;
}
}
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>No</th>
<th>이름</th>
</tr>
</thead>
<tbody>
<tr th:each="member : ${memberLists}">
<td th:text="${member.id}"/>
<td th:text="${member.name}"/>
</tr>
</tbody>
</table>
</body>
</html>
cmb를 킨다
cd C:\spring\springSrc\oBootHello
dir ( 폴더 확인 )
gradlew build
BUILD SUCCESSFUL 완료 메시지 확인
dir -> build 폴더 생성 확인
cd build\libs
dir -> oBootHello-version1.0.jar 생성
스프링 끄기
java -jar oBootHello-version1.0.jar
엑세스 허용
스프링 꺼진 상태에서 페이지 불러오기 성공
oracle driver 추가
ojdbc8 최신버전이어도 상관 없다
implementation 'org.springframework.boot:spring-boot-starter-jdbc' -> JDBC API
plugins {
id 'org.springframework.boot' version '2.7.5'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
id 'java'
}
group = 'com.oracle'
version = 'version1.0'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
}
tasks.named('test') {
useJUnitPlatform()
}
-> spring boot pdf 참고
package com.oracle.oBootDBConnect.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
@RequestMapping("hello")
public String hello(Model model) {
// prefix -> templates
// suffix -> .html
logger.info("start...");
model.addAttribute("parameter", "boot start...");
return "hello";
}
}
package com.oracle.oBootDBConnect.domain;
public class Member1 {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
server.port=8382
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>hello.html</h1>
<p th:text="안녕+${parameter}">
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>나 Index야</h1>
<a href="/hello">Hello</a>
<a href="/members/memberForm">회원 가입</a>
<a href="/members/memberList">회원 목록</a>
</body>
</html>
DB 설치했지만 DB 관련된 요소를 세팅 안함
✍application.properties에 datasource 기술
server.port=8382 # Oracle Connect spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe spring.datasource.username=scott spring.datasource.password=tiger
컨트롤러가 정적 파일보다 우선순위가 높음
package com.oracle.oBootDBConnect.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
// 컨트롤러가 정적 파일보다 우선순위가 높음
@GetMapping("/")
public String home() {
System.out.println("HomeController home() start...");
return "home";
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Home</h1>
<a href="/hello">Hello</a><p>
<a href="/members/memberForm">회원 가입</a><p>
<a href="/members/memberList">회원 목록</a><p>
</body>
</html>
package com.oracle.oBootDBConnect.repository;
import java.util.List;
import com.oracle.oBootDBConnect.domain.Member1;
public interface MemberRepository {
Member1 save(Member1 member1);
List<Member1> findAll();
}
package com.oracle.oBootDBConnect.repository;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.oracle.oBootDBConnect.domain.Member1;
@Repository
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member1> store = new HashMap<Long, Member1>();
private static long sequence = 0L;
@Override
public Member1 save(Member1 member1) {
System.out.println("MemoryMemberRepository save start...");
member1.setId(++sequence);
store.put(member1.getId(), member1);
return member1;
}
@Override
public List<Member1> findAll() {
System.out.println("MemoryMemberRepository findAll start...");
return new ArrayList<Member1>(store.values());
}
}
package com.oracle.oBootDBConnect.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.oracle.oBootDBConnect.domain.Member1;
import com.oracle.oBootDBConnect.repository.MemberRepository;
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// 회원 가입
public Long memberSave(Member1 member1) {
memberRepository.save(member1);
return member1.getId();
}
// 전체 회원 조회
public List<Member1> findMembers() {
System.out.println("MemberService findMembers() start...");
return memberRepository.findAll();
}
}
package com.oracle.oBootDBConnect.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.oracle.oBootDBConnect.domain.Member1;
import com.oracle.oBootDBConnect.service.MemberService;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping(value = "/members/new")
public String createForm() {
System.out.println("MemberController /members/new start...");
return "members/createMemberForm";
}
@PostMapping(value = "/members/new")
public String memberSave(Member1 member1) {
System.out.println("MemberController memberSave start...");
memberService.memberSave(member1);
return "redirect:/";
}
// 전체 조회 화면
@GetMapping(value = "/members")
public String memberLists(Model model) {
List<Member1> memberList = memberService.findMembers();
model.addAttribute("members", memberList);
return "members/memberList";
}
}
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>회원등록</h1>
<div class="container">
<form action="/members/new" method="post">
<div class="form-group">
<label for="name">이름</label>
<input type="text" id="name" name="name" placeholder="이름을 입력하세요">
</div>
<button type="submit">등록</button>
</form>
</div>
</body>
</html>
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>회원 기능</h1>
<div class="container">
<div>
<table border="1">
<thead>
<tr>
<th>No</th>
<th>이름</th>
</tr>
</thead>
<tbody>
<tr th:each="member : ${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>