국비학원_66일차(Spring Boot, 회원가입, 회원목록, 배포, DB연결)

써니·2022년 10월 26일
0

spring

목록 보기
8/23

🍃Spring Boot

🔻oBootHello

🤝회원가입(전통적)

📂 src/main/resource - static

  • index.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>

[com.oracle.oBootHello.controller]

  • MemberController.java
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:/";
	}
}

[com.oracle.oBootHello.service]

  • MemberService.java( commnad )
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;
	}
}

[com.oracle.oBootHello.repository]

  • MemberRepository.java( interface )
package com.oracle.oBootHello.repository;

import com.oracle.oBootHello.domain.Member1;

public interface MemberRepository {
	Member1		save(Member1 member1);
}

🔎DB없이 Memory에 저장할 때

  • 일회성 Memory를 저장할 때는 보통 Map을 쓴다.
  • private static Long sequence = 0L; -> Long 형으로 casting

  • MemoryMemberRepository.java( + interface )
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;
	}
}

[com.oracle.oBootHello.domain]

  • Member1.java -> dto
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;
	}
}

📂 src/main/resource

[templates.members]

  • memberForm.html
<!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>

폴더 구성




🤝회원가입(Bean)

[com.oracle.oBootHello.service]

  • MemberService.java -> @Service 등록
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();
	}
}

[com.oracle.oBootHello.controller]

  • MemberController.java( DI로 할당 )

@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:/";
	}
}

[com.oracle.oBootHello.repository]

  • MemoryMemberRepository.java( +interface )
    @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로 했을 때 결과 -> 동일하게 나옴




📝회원목록

[com.oracle.oBootHello.controller]

  • MemberController.java
	@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";
	}

[com.oracle.oBootHello.service]

  • MemberService.java
	// 회원 목록
	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;
	}

[com.oracle.oBootHello.repository]

  • MemberRepository.java
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();
}
  • MemoryMemberRepository.java
    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;
	}
}

📂 src/main/resource

[templates.members]

  • memberList.html
<!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>


📤배포

  1. cmb를 킨다

  2. cd C:\spring\springSrc\oBootHello

  3. dir ( 폴더 확인 )

  4. gradlew build

  5. BUILD SUCCESSFUL 완료 메시지 확인

  6. dir -> build 폴더 생성 확인

  7. cd build\libs

  8. dir -> oBootHello-version1.0.jar 생성

  9. 스프링 끄기

  10. java -jar oBootHello-version1.0.jar

  11. 엑세스 허용

  12. 스프링 꺼진 상태에서 페이지 불러오기 성공

👉배포과정



🍃Boot DB 연결

💻 초기 설정

oracle driver 추가

🔻oBootDBConnect

  • build.gradle
    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()
}

💾H2 DB 설치

-> spring boot pdf 참고


[com.oracle.oBootDBConnect.controller]

  • HelloController.java
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";
	}
	
}

[com.oracle.oBootDBConnect.domain]

  • Member1.java
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;
	}
}

📂 src/main/resource

  • application.properties
server.port=8382

📂 src/main/resource

  • hello.html
<!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>

📂 src/main/resource - static

  • index.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 설치했지만 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




🔧컨트롤러와 정적파일

[com.oracle.oBootDBConnect.controller]

  • HomeController.java
    컨트롤러가 정적 파일보다 우선순위가 높음
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";
	}
}

📂 src/main/resource

  • home.html
<!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>




🤝회원가입(오류남❌)

[com.oracle.oBootDBConnect.repository]

  • MemberRepository( interface - 저장 인터페이스)
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();
}

  • MemoryMemberRepository
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());
	}

}

[com.oracle.oBootDBConnect.service]

  • MemberService.java
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();
	}
}

[com.oracle.oBootDBConnect.controller]

  • MemberController.java
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";
	}
}	

📂 src/main/resource

[templates.members]

  • createMemberForm.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">
		<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>

  • memberList.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>

0개의 댓글