INTELLIJ 홈 화면 추가

* welcome페이지를 만들었다고 해도, controller에 이미 같은경로가 만들어져 있으면, 우선순위에 밀린다

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "home";
    }
}
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
    <div>
        <h1>Hello Spring</h1>
        <p>회원 기능</p>
        <p>
            <a href="/members/new">회원 가입</a>
            <a href="/members">회원 목록</a>
        </p>
    </div>
</div> <!-- /container -->

</body>
</html>

 

실행 결과 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ 등록

package hello.hellospring.controller;

import hello.hellospring.domain.Member;
import hello.hellospring.service.MemberService;
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;

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

    @GetMapping("/members/new")
    public String createForm(){
        return "members/createMemberForm";
    }

    @PostMapping("/members/new")
    public String create(MemberForm form) {
        Member member = new Member();
        member.setName(form.getName());

        memberService.join(member);

        return "redirect:/";
    }
}
package hello.hellospring.controller;

public class MemberForm {
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<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> <!-- /container -->
</body>
</html>

 

실행 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ 조회

package hello.hellospring.controller;

import hello.hellospring.domain.Member;
import hello.hellospring.service.MemberService;
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 java.util.List;

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

    @GetMapping("/members/new")
    public String createForm(){
        return "members/createMemberForm";
    }

    @PostMapping("/members/new")
    public String create(MemberForm form) {
        Member member = new Member();
        member.setName(form.getName());

        memberService.join(member);

        return "redirect:/";
    }

    @GetMapping("/members")
    public String list(Model model){
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);
        return "members/memberList";
    }
}
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
    <div>
        <table>
            <thead>
            <tr>
                <th>#</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> <!-- /container -->
</body>
</html>

 

실행 결과

 

 

 

 

 

 

 

SPRING 비밀번호 암호화(db에 저장)

https://mvnrepository.com/ - spring security web 검색 - 첫번째꺼 클릭 

- 아무버전(최신 버전) 클릭 - maven 부분 복사 -

pom.xml 붙여넣기(버전을 스프링 버전에 맞게 ${org.springframework-version})

 

service쪽에서 BCryptPasswordEncoder en = new BCryptPasswordEncoder();

en.encode(암호화 할 변수) : 해당 변수가 암호화 된다

en.matches("비교할 변수", "암호화된 변수") : 암호화한 변수를 풀어서 비교하는 방법 (복호화)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SPRING 다음 주소 api 사용

다음 주소 api 검색 - 해당하는 api 복사 - register.jsp에 붙여넣기

같은 name의 여러개의 값을 dto로 받아오면 ,(콤마)를 기준으로 한번에 받아온다

* split을 사용하여 ,(콤마)를 기준으로 잘라낼 수 있다.

 

같은 name의 여러개의 값을 req로 받아오려면, req.getParameterValues()로 받아온다 (배열 형식)

 

* 해당하는 api관련 script문은 resources폴더 안에서 따로 관리 (javascript 파일)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script type="text/javascript" src="<%= request.getContextPath() %>/resources/js/daumPost.js">
</script>
</head>
<body>
	<%@ include file="/WEB-INF/views/default/header.jsp" %>
	<h3> - 회 원 가 입 -</h3>
	<form action="register" method="post">
		<input type="text" name="id"><br>
		<input type="text" name="pwd"><br>
		<input type="text" id="addr1" name="addr" readonly placeholder="우편번호"><br>
		<input type="text" id="addr2" name="addr" readonly placeholder="주소"><br>
		<input type="text" id="addr3" name="addr" placeholder="상세주소">
		<button type="button" onclick="daumPost()">우편번호 검색</button><br>
		<input type="submit" value="가입"><br>
	</form>
</body>
</html>
function daumPost() {
    new daum.Postcode({
        oncomplete: function(data) {
            // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분입니다.
            // 예제를 참고하여 다양한 활용법을 확인해 보세요.
            console.log(data);
            console.log(data.userSelectedType)
            let addr = "";
            if (data.userSelectedType == "R") {
            	addr = data.roadAddress;
			}else{
            	addr = data.jibunAddress;
			}
            document.getElementById("addr1").value=data.zonecode;
            document.getElementById("addr2").value=addr;
            document.getElementById("addr3").focus();
        }
    }).open();
}
	@PostMapping("register")
	public String register(MemberDTO dto, HttpServletRequest req) {
		System.out.println("addr : " + dto.getAddr());
		String[] addrs = req.getParameterValues("addr");
		System.out.println(addrs[0]);
		System.out.println(addrs[1]);
		System.out.println(addrs[2]);
		int result = ms.register(dto);
		
		if(result == 1) {
			return "redirect:login";
		}
		return "redirect:register_form";
	}

 

실행 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SPRING Interceptor

* 컨트롤러 실행 전, 컨트롤러가 실행 후 처리할 게 있으면 Interceptor 사용

Filter : DispatcherServlet이 실행되기 전, web.xml 설정

Interceptor : DispatcherServlet이 실행된 후, spring-web.xml 설정

preHandle : 컨트롤러가 호출되기 전 실행

postHandle : 컨트롤러가 실행된 후 호출

 

Interceptor 사용 설정

해당 클래스에 extends HandlerInterceptorAdapter 상속을 받아야 Interceptor 사용 가능

(alt + shift + s) - Override/Implement Methods - postHandle, preHandle 체크 - ok

preHandle 실행 전, postHandle 컨트롤러 실행 후

* preHandle, postHandle메소드의 파라미터값 변경 불가

* return true : 해당 경로로 보내줌, return false : 해당 경로로 안 보내줌

 

Interceptor 빈 생성

servlet-context.xml - <beans:bean id="변수명" class="Interceptor클래스 위치" />

<interceptors><interceptor><mapping path="경로 지정" /><benas:ref bean="변수명" /></interceptor></interceptors>

* 초록색 : 같은 값

 

 

package com.care.root.interceptor;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.care.root.common.SessionCommon;

public class MemberInterceptor extends HandlerInterceptorAdapter implements SessionCommon{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("index 실행 전 출력");
		HttpSession session = request.getSession();
		if (session.getAttribute(LOGIN) == null) {
			//response.sendRedirect("login");
			response.setContentType("text/html; charset=utf-8");
			PrintWriter out = response.getWriter();
			out.print("<script>alert('로그인 먼저 하세요');"
						+"location.href='login';</script>");
			return false;
		}
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("index 실행 후 동작");
	} 
}
	<beans:bean id="mi" class="com.care.root.interceptor.MemberInterceptor" />
	<interceptors>
		<interceptor>
			<mapping path="/member/memberInfo" />
			<mapping path="/member/info" />
			<beans:ref bean="mi" />
		</interceptor>
	</interceptors>

 

실행 결과

 

 

 

 

 

 

 

 

INTELLIJ 스프링 빈을 등록하는 방법 (컴포넌트 스캔과 자동 의존관계 설정)

* @Autowired를 한 객체는 @Service든 @Repository 등을 해줘야 한다

 

컴포넌트 스캔과 자동 의존관계 설정

: @Controller나 @Service등을 쓰는 방식 (해당하는 것들이 모두 컴포넌트이다, 싱글톤 형식)

*@Controller랑 @Service를 @Autowired로 연결해주는 형식

* 컴포넌트는 main메서드에 해당하는 패키지의 하위 패키지에서만 설정 가능

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ 스프링 빈을 등록하는 방법 ( 자바 코드로 직접 스프링 빈 등록하기 )

자바 코드로 직접 등록

SpringConfig 클래스 생성 - @Configuration 작성 - @Bean 작성(SpringBean을 등록하겠다는 의미)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ DI

1. 생성자 주입(가장 좋다)

 

2. 필드 주입(세팅할 때, 변경이 힘들어 좋지 않다.)

 

3. Setter 주입(중간에 변경할 필요가 없지만, public으로 설정해야 한다)

(alt + insert) - setter - 생성 - 생성된 메소드에 @Autowried 작성

 

* 정형화된 것은 컴포넌트 스캔 사용, 정형화되지 않거나 구현 클래스를 변경해야 하면 스프링 빈 등록

 

 

 

 

 

 

 

 

 

INTELLIJ 비지니스 요구사항 정리

데이터 : 회원ID, 이름

기능 : 회원 등록, 조회

아직 데이터 저장소가 선정되지 않음

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ 회원 도메인과 리포지토리 만들기

Optional : null일수도, 아닐수도 있는 객체를 감싸는 래퍼 클래스

Optional.ofNullable(객체명) : null인지 아닌지 모를 때 사용

 

store.values().stream()

.filter(member -> member.getName().equals(name))

.findAny();

: store의 values값을 반복문처럼 돌려서, 만약 .filter뒤쪽에 해당하는 값이 true일때만 필터링이 적용

finAny()는 하나라도 찾는것, 만약 찾으면 반환, 못찾으면 null값 반환

package hello.hellospring.domain;

public class Member {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
}
package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}
package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }
    @Override
    public Optional<Member> findById(Long id) {
       return Optional.ofNullable(store.get(id));
    }
    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                   .filter(member -> member.getName().equals(name))
                   .findAny();
    }
    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ 회원 리포지토리 테스트 케이스 

* main메서드를 통해서 실행하면,  오래 걸리고 한번에 실행하기 어렵다

따라서, JUNIT을 통해 테스트를 한다

@Test : test실행이 가능하다

 

Assertions.assertThat(member).isEqualTo(result) : 만약 둘의 값이 같다면 ↓

 

값이 다르다면 ↓

 

* .get() : 해당 객체를 가져온다

 

* 아래와 같이 선택(alt + enter)하면, 

Assertions.assertThat(member).isEqualTo(result)를 assertThat(member).isEqualTo(result)으로 사용 가능

 

* test를 각 메소드에서 실행 시킬수도 있지만, 클래스에서 실행하면 전체 다 실행 가능하다.

* 테스트 순서는 보장되어 있지 않다

 

@AfterEach : 각 메소드의 테스트가 끝나면, @AfterEach 메소드를 호출한다.

해당하는 저장소를 clear하는 메소드를 만든후, @AfterEach에 해당하는 메소드에서 호출한다

* ↓아래에 해당하는 코드가, store를 clear하는 명령어 및 메소드이다.

 

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.*;

public class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach(){
        repository.clearStore();
    }

    @Test
    public void save(){
        Member member = new Member();
        member.setName("spring");

        repository.save(member);
        Member result = repository.findById(member.getId()).get();

        assertThat(member).isEqualTo(result);
        //Assertions.assertEquals(member, result);
    }

    @Test
    public void findByName(){
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        Member result = repository.findByName("spring1").get();

        assertThat(result).isEqualTo(member1);
    }

    @Test
    public void findAll(){
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        List<Member> result = repository.findAll();

        assertThat(result.size()).isEqualTo(2);
    }
}

 

실행 결과

정상적으로 test 실행

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ 회원 서비스 개발

변수명.ifPresent(함수) : 변수의 값이 null이 아니면 함수 실행 (해당 변수가 Optional이여서 가능)

* (ctrl + t)를 통해 해당 기능 함수를 하나의 메소드로 묶어서 호출하는 형식으로 변환 가능

throw new IlligalStateException("어쩌고") : 해당 함수가 예외가 발생하였을 때, "어쩌고" 전송

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;

import java.util.List;
import java.util.Optional;

public class MemberService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();

    public Long join(Member member){// 회원가입

        validateDuplicateMember(member);// 중복 회원 검증
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
            .ifPresent(m -> {
                 throw new IllegalStateException("이미 존재하는 회원입니다");
        });
    }
    public List<Member> findMembers() { // 전체 회원 조회
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ 회원 서비스 테스트

 

(ctrl + shift + t) : 해당하는 클래스의 테스트 클래스를 자동으로 만들어주는 역할

 

* 왼쪽의 MemberService에서  (ctrl + shift + t)설정을 마치면 오른쪽에 클래스(MemberServieTest)클래스가 생성된다

* 테스트 클래스의 메소드 명을 한글로 써도 무관하다

 

* ctrl + alt + v : 해당하는 객체의 타입을 만들어서 지정해준다

왼쪽에서 오른쪽으로 변함

 

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;

import java.util.List;
import java.util.Optional;

public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }


    public Long join(Member member){// 회원가입

        validateDuplicateMember(member);// 중복 회원 검증
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
            .ifPresent(m -> {
                 throw new IllegalStateException("이미 존재하는 회원입니다");
        });
    }
    public List<Member> findMembers() { // 전체 회원 조회
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }
}
package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Optional;

import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

    @AfterEach
    public void afterEach(){
        memberRepository.clearStore();
    }

    @Test
    void 회원가입() {
        //given
        Member member = new Member();
        member.setName("spring");

        //when
        Long saveId = memberService.join(member);

        //then
        Member findMember = memberService.findOne(saveId).get(); //asdfasdfasd
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    @Test
    public void 중복_회원_예외(){
        Member member1 = new Member();
        member1.setName("sping");

        Member member2 = new Member();
        member2.setName("sping");

        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다");
//        try {
//            memberService.join(member2);
//            fail();
//        }catch (IllegalStateException e){
//            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다");
//        }

    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

 

 

 

 

 

 

 

 

 

INTELLIJ 정적 컨텐츠

정적 컨텐츠 : 웹브라우저에 그냥 내려주는 서비스, 변환하지 않고 넘겨준다

정적 컨텐츠 생성 위치 : src/main/resources/static/파일명(hello-static).html

해당 파일 경로 : localhost:8080/파일명(hello-static) .html

* 동작 원리 : 웹 브라우저에서 (hello-static).html의 경로를 요청 받으면, 먼저 컨트롤러에서 찾는다. 

해당 경로가 컨트롤러에 없으면,  src/main/resources/static/에서 찾는다.

<!DOCTYPE HTML>
<html>
<head>
    <title>static content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>

 

실행 결과 

경로 확인

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ mvc & 템플릿 엔진

mvc, 템플릿 엔진 : 서버에서 html을 동적으로 바꿔서 내보내는 것, 변환 후 넘겨준다

* @RequestParam("아이디명") 타입 변수명 : req값을 넒겨 받는 용도

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data", "hello!!");
        return "hello";
    }

    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model){
        model.addAttribute("name", name);
        return "hello-template";
    }
}

 

실행 결과

경로 확인

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ api

api : json 구조로 클라이언트에게 전달하는 방식

@ResponseBody : HTTP body부분에 직접 넣겠다는 의미

따라서, 해당 페이지 페이지 소스를 보게 되면 보통 아래와 같이 html태그들이 보인다

 

하지만, @ResponseBody를 추가하게 되면 아래와 같이 html태그가 없다

 

 

json이란? key, value로 이루어진 구조

json형식 만드는법 : return 값을 html파일로 명시하지 않고, 보내고 싶은 데이터를 지정

위와 같이, 받아온 name을 getter setter를 통해 저장한 후 해당 객체를 보내준다.

 

실행 결과

json 형식 !!!

 

@Responsebody가 붙어있지 않으면, return을 통해  templates/html파일로 전달한다 (viewResolver 동작)

@ResponseBody 가 있으면, return값이 문자인 경우 문자 내용을 그대로 반환 (StringConverter 동작)

return값이 객체인 경우, default값으로 json형식으로 반환 (JsonConverter 동작)

 

 

 

 

 

 

 

 

INTELLIJ 기본 설정 및 실행

* gradle : 버전 설정, 라이브러리 땡겨옴

* 만약 실행(run)이 안될 경우, .idea를 삭제하고 다시 실행시켜본다.

해당 main이 실행이 되면

localhost:8080 검색 - 

위와 같이 뜨면 정상적으로 작동중.

 

* File - Settings - gradle 검색 - (Build and run using, Run tests using) intellij로 변경

이유 : gradle을 거치지 않아, 속도가 더 빠르다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ 라이브러리

gradle 관련 라이브러리 등 확인 가능

* 실무에서는 system.out 대신 log를 사용한다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ view 환경 설정

* welcome 페이지 = domain(localhost:8080)만 입력했을 때 나오는 화면

* welcome 페이지 명 : html명은 반드시 index.html으로 설정해야 한다

* welcome 페이지 위치 : src/main/resources/static/index.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ controller

 

controller 설정 위치 : src/main/java/파일명(hello.hello-sping)/패키지(controller) 생성

해당 패키지 안에 클래스(HelloController) 생성

@Controller 및 @GetMapping 추가

 

해당하는 @GetMapping한 메소드 return한 내용은 src/main/resources/templates/파일명.html로 이동

* Thymeleaf는 템플릿 엔진으로, 동적으로 HTML파일을 처리하는데 사용

* 따라서 controller에서 받은 데이터를 처리해야 하므로 Thymeleaf를 사용

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTELLIJ 빌드 및 실행

 

* 빌드를 실행하기 전에는, 서버를 끄고 실행한다

빌드 실행 방법 : terminal창 이동 - 해당 프로젝트 위치로 이동(cd사용)

해당 프로젝트 위치에서 (./gradlew build) 명령어 실행

해당 브로젝트 위치/build 이동 - 해당 브로젝트 위치/build/libs 이동

ls를 통해 directoryf를 확인 - 마지막에 SNAPSHOT.jar가 포함된 Name 복사

해당 위치에서 (java -jav 붙여넣기) 명령어 실행 - 아래와 같이 화면 출력

- 해당 페이지가 뜨면, 서버도 정상적으로 실행 

* 만약 실행이 잘 안 될 경우, ./gradlew build 대신 ./gradlew clean build 실행

 

 

 

 

 

 

 

 

 

SPRING 정적 파일

* src/main/webapp/resources폴더안에 생성

css파일 불러올 땐 <link>, javascript파일 불러올 땐 <script>

* servlet-context.xml(16번째 줄)에서 경로 조절 가능

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>

<c:set var="url" value="<%= request.getContextPath() %>"></c:set>
<html>
<head>
	<title>Home</title>
	<link href="${url}/css/test.css" rel="stylesheet">
	<link href="${url}/css/test2.css" rel="stylesheet">
	<script type="text/javascript" src="${url}/js/test.js"></script>
</head>
<body>
<c:url value="/resources/img/asdf.png" var="path" /> 
path: ${path }<br>
req : <%= request.getContextPath() %>/img/asdf.png<br>
page : ${pageContext.request.contextPath }/img/asdf.png<br>
<img src="${path}" width="100" height="100">
<h1>
	Hello world!!!!!!  
</h1>

<P>  The time on the server is ${serverTime}. </P>
<button type="button" onclick="test()">클릭</button>
</body>
</html>

실행 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SPRING cookie 

쿠키 생성

HttpServletResponse를 컨트롤러에서 받아온다.

Cookie c = new Cookie("쿠키명", "쿠키값");

c.setMaxAge(5) : 쿠키 5초 유지

res.addCookie(c) : 쿠키 추가

c.setPath("경로") : 쿠키 path 지정

 

쿠키 받아오기 (모든 쿠키)

HttpServletRequest를 컨트롤러에서 받아온다.

req.getCookies() : 쿠키값 받아오기(배열 형식으로 받아온다)

 

원하는 쿠키만 받기

@CookieValue(value="해당 쿠키명", required = false) Cookie 저장할 변수명

: 해당하는 쿠키값은 변수명에다가 저장한다, 존재하지 않을 경우 null로 표현

 

* document.cookie : 자바스크립트상에서 쿠키값 받아오는 방법(이름, 밸류 다 나옴)

* split을 통해 이름과 밸류를 나눈다(배열 형식으로 저장)

* 인덱스 번호를 통해 본인의 쿠키가 맞는지 확인

package com.care.ex01;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class CookieController {

	@GetMapping("cookie")
	public String myCookie(HttpServletResponse res, 
						HttpServletRequest req,
						@CookieValue(value="myCookie", required = false) Cookie cook) {
		System.out.println("cook : " + cook);
		System.out.println(cook.getName());
		System.out.println(cook.getValue());
		Cookie cookie = new Cookie("myCookie", "testCookie");
		cookie.setMaxAge(5);
		res.addCookie(cookie);
		Cookie[] arrCookie = req.getCookies();
		for (Cookie c : arrCookie) {
			System.out.println("name : " + c.getName());
			System.out.println("value : " + c.getValue());
		}
		return "cookie/cookie";
	}
	@GetMapping("cookie02")
	public String myCookie02(Model model, 
						@CookieValue(value="myCookie", required = false) Cookie cook) {
		if (cook != null) {
			model.addAttribute("cook", cook.getValue());
		}
		return "cookie/cookie02";
	}
	@GetMapping("popup02")
	public String pop02() {
		return "cookie/popup02";
	}
	@GetMapping("cookieChk")
	public void cookieChk(HttpServletResponse res) {
		Cookie cook = new Cookie("myCookie", "testCookie");
		cook.setMaxAge(5);
		cook.setPath("/");
		res.addCookie(cook);
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	function popup() {
		let url = "popup02";
		let setWindow = "width=300, height=200, top=500, left=500";
		//if ("${cook}" == "") {
		//	window.open(url, "", setWindow);
		//}
		console.log("cook : " + document.cookie)
		let cookie = document.cookie.split("=");
		console.log("cook : " + cookie)
		console.log("cook : " + cookie[0])
		console.log("cook : " + cookie[1])
		if (cookie[0] != "myCookie") {
			window.open(url, "", setWindow);
		}
	}
</script>
</head>
<body onload="popup()">
	cook : ${cook }<br>
	쿠키 페이지
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	function chk() {
		location.href="cookieChk";
		window.close();
	}
</script>
</head>
<body>
	<h3>팝 업 창</h3>
	<hr>
	<input id="check" type="checkbox" onclick="chk()">
	<label for="check">하루동안 열지않음!!!</label>
</body>
</html>

 

실행 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SPRING session

HttpSession session = req.getSession(); : 세션 생성

session.setAttribute("키", "밸류") : 세션 추가

* 부여하는 세션 이름이 겹칠 경우, sessionScope.이름 을 사용하면 확인 가능

session.removeAttribute("키명") : 특정 세션만 삭제

session.invalidate() : 모든 세션 삭제

* HttpSession session을 받아와서 처리 가능

package com.care.ex01;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class SessionController {
	
	@GetMapping("makeSession")
	public String makeSession(HttpServletRequest req) {
		HttpSession session = req.getSession();
		session.setAttribute("id", "aaa");
		session.setAttribute("name", "홍길동");
		session.setAttribute("age", "20");
		return "session/makeSession";
	}
	@GetMapping("resultSession")
	public String resultSession(Model model) {
		model.addAttribute("id", "asdf모델");
		return "session/resultSession";
	}
	@GetMapping("delSession")
	public String delSession(HttpServletRequest req, 
							HttpSession session) {
		HttpSession s = req.getSession();
		System.out.println("s.id : " + s.getAttribute("id"));
		s.removeAttribute("id");
		System.out.println("session.name : " + session.getAttribute("name"));
		session.invalidate();
		return "session/delSession";
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>세션 설정</h3>
	id : ${id }<br>
	name : ${name }<br>
	age : ${sessionScope.age }<br>
	req.age : <%= session.getAttribute("age") %>
	<hr>
	<a href="resultSession">세션 확인</a>
	<a href="delSession">세션 삭제</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>세션 확인</h3>
	id : ${id }<br>
	sessionScope.id : ${sessionScope.id}<br>
	name : ${name }<br>
	age : ${sessionScope.age }<br>
	req.age : <%= session.getAttribute("age") %>
	<hr>
	<a href="makeSession">세션 설정</a>
	<a href="delSession">세션 삭제</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>세션 삭제</h3>
	id : ${id }<br>
	sessionScope.id : ${sessionScope.id}<br>
	name : ${name }<br>
	age : ${sessionScope.age }<br>
	req.age : <%= session.getAttribute("age") %>
	<hr>
	<a href="makeSession">세션 설정</a>
	<a href="resultSession">세션 확인</a>
</body>
</html>

 

실행 결과 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SPRING session 활용(login)

* session은 jsp파일에서도 설정 가능, controller에서도 설정 가능

package com.care.ex01;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

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 org.springframework.web.bind.annotation.RequestParam;

@Controller
public class SessionController {
	
	@GetMapping("makeSession")
	public String makeSession(HttpServletRequest req) {
		HttpSession session = req.getSession();
		session.setAttribute("id", "aaa");
		session.setAttribute("name", "홍길동");
		session.setAttribute("age", "20");
		return "session/makeSession";
	}
	@GetMapping("resultSession")
	public String resultSession(Model model) {
		model.addAttribute("id", "asdf모델");
		return "session/resultSession";
	}
	@GetMapping("delSession")
	public String delSession(HttpServletRequest req, 
							HttpSession session) {
		HttpSession s = req.getSession();
		System.out.println("s.id : " + s.getAttribute("id"));
		s.removeAttribute("id");
		System.out.println("session.name : " + session.getAttribute("name"));
		session.invalidate();
		return "session/delSession";
	}
	@GetMapping("login")
	public String login() {
		return "session/login";
	}
	@PostMapping("check")
	public String check(@RequestParam String id, 
							@RequestParam String pwd,
							HttpSession session) {
		
		String DB_id = "1", DB_pwd = "1";
		if (DB_id.equals(id) && DB_pwd.equals(pwd)) {
			session.setAttribute("loginUser", id);
			session.setAttribute("nick", "홍길동");
			return "session/main";
		}
		return "redirect:login";
	}
	@GetMapping("logout")
	public String logout(HttpSession session) {
		if (session.getAttribute("loginUser") == null) {
			return "redirect:login";
		}
		session.invalidate();
		return "session/logout";
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:choose>
		<c:when test="${loginUser == null }">
			<form action="check" method="post">
				<input type="text" name="id"><br>
				<input type="text" name="pwd"><br>
				<input type="submit" value="로그인"><br>
			</form>
		</c:when>
		<c:otherwise>
			${nick}님 로그인 상태<br>
			<a href="logout">로그아웃</a>
		</c:otherwise>
	</c:choose>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	${nick }님 환영합니다<br>
	<a href="logout">로그아웃</a>
	<a href="login">로그인</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<script type="text/javascript">
		alert("로그아웃 성공!!");
		location.href="login";
	</script>
</body>
</html>

 

실행 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SPRING database (1)

단위 테스트 : 각각의 메소드 별로 테스트

통합 테스트 : 단위테스트를 통한 메소드들을 결합하여 테스트

 

단위 test

test를 하기위한 기능 가져오기

https://mvnrepository.com/  - spring-test 검색 - 첫번째 클릭 - 아무거나 버전(6.1.3) - maven내용 복사

- pom.xml(118번쨰줄 밑) 붙여넣기 - 해당 버전 대신 ${org.springframework-version}작성

* ${org.springframework-version} : 알아서 버전 설정

 

JUnit을 실행하기 위한 라이브러리 추가

프로젝트 우클릭 - Properties - Java Buid Path - Libraries - Add Library - JUnit선택 - next - JUnit-4선택 - finish - apply

 

서버 구동하지않고, test를 구동하기 때문에 test전용 xml파일 작성

test전용 xml파일 - Namespaces - context 체크

Source - <context:component-scan base-package="해당 test클래스 패키지" />

 

test클래스에서 작성해야하는 것들

@RunWith(SpringRunner.class) : @Autowired에 해당하는 것들을 확인하도록 설정

@contextConfiguration(locations={"classpath:해당하는 test의 xml파일"}) : 해당하는 파일을 진행

@Autowired 클래스명 변수명 : test를 통해 확인하고 싶은 클래스

@Test : 해당하는 메소드 생성하고, 해당 메소드를 통해 확인

assertNotNull(확인하고싶은 클래스의 변수명) : 성공인지 실패인지 알려줌(성공 = 초록, 실패 = 빨강)

해당메소드 클릭 후 ctrl + F11

 

 

DB 연동

* connection pool : 미리 만든 값을 빌려와서 사용(효율적)

* mybatis : 명령어를 통해 실행하도록 해주는 역할

 

hikaricp 추가

https://mvnrepository.com/ - hikaricp 검색 - 첫번째 클릭 - 3.3.1버전 클릭 - maven내용 복사 

- pom.xml -  붙여넣기

jdbc 추가

https://mvnrepository.com/ - spring jdbc 검색 - 첫번째 클릭 - 아무버전 클릭 - maven내용 복사

- pom.xml  -붙여넣기 - 해당 버전 대신 ${org.springframework-version}작성

mybatis 추가

https://mvnrepository.com/ - mybatis 검색 - 첫번째 클릭 - 3.4.6버전 클릭 - maven내용 복사

- pom.xml  -붙여넣기 

mybatis(2) 추가

https://mvnrepository.com/ - mybatis 검색 - 두번째 클릭 - 1.3.2버전 클릭 - maven내용 복사

- pom.xml  -붙여넣기 

ojdbc 추가

cmd - sqlplus - db버전 확인

11버전일 경우

https://mvnrepository.com/ - ojdbc6 검색 - 첫번째 클릭 - 11.2.0.1버전 클릭 - maven내용 복사

- pom.xml  -붙여넣기 

19버전 이상일 경우

https://mvnrepository.com/ - ojdbc8 검색 - 첫번째 클릭 - cmd로 확인한 버전 클릭 - maven내용 복사

- pom.xml  -붙여넣기 

 

db 설정(연결)

위에 설정한 값들 추가(객체 생성)

root-context.xml - bean 및 property 생성

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="username" value="c##LTY"></property>
<property name="password" value="1213"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
</bean>

<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikariConfig"></constructor-arg>
</bean>
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"></property>
<property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml"></property>
</bean>

 

mybatis 설정

* mybatis는 memberMapper.xml에서 실행한다

mybatis 검색 - 첫번째 - Getting Started - (Exploring Mapped SQL Statements)에 해당하는 문장 복사 - 

resources/mappers/member/memberMapper.xml - 붙여넣기

- 필요없는것 지우기 - namespace="dao경로" 작성

root-context.xml - Namsapace - (mybatis -spring) 체크

Source - <mybatis-spring:scan base-package="dao경로" /> 

 

* dao에 지정한 메소드명과, mapper.xml에 지정한 <insert>태그 안에 id와 일치하면 실행

넘어온 값은 #{}으로 받는다

 

 

 

통합 test

* @Before : @test전에 실행 된다(초기화 목적)

 

* 통합 테스트를 하기 위해서 Mock이 필요.

* 따라서 import가 알아서 안되기 때문에 입력해야함

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;

 

MockMvc mock = MockMvcBuilders.standaloneSetup("객체").build : 해당 객체를 동작하는 mock 생성

mock.perform(post("/경로").param("id", "1234").param("name", "아무나"))

: 해당 경로로 post방식으로 요청을 보내고, id와 name이라는 파라미터를 설청하여 요청을 보낸다

.andDo(print()) : 요청 및 응답을 출력

.andExpect(forwardedUrl("index")) : 위에 경로의 요청을 처리한 후, index페이지로 forward한다

 

.andExpect(status().isOk()) : status가 200이라면

* Status = 200 : 성공

 

아무 xml(root-context.xml) -  <bean id="txMgr" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds"></property>
</bean>

: 해당 내용을 실행하고, rollback한다

@Transactional(transactionManager = "txMgr") : rollback기능을 하고싶은 클래스에 추가하는 방법

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SPRING db (2)

resultMap : dto값과 db컬럼명이 다를 수 있기 때문에

primary key = <id/>

나머지 = <result/> (proerty = "dto 명", column = "db 컬럼명")

<select> 태그 안에 resultMap="resultMap의 id명" : resultMap 적용

* model().attributeExists("키명") : 모델의 해당 키까지 접근 가능한지 확인

* redirect가 일어날 경우 status가 302이기 때문에, .andExpect(status().is3xxRedirection()); 사용

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Quiz 01

풀이 과정

위에서 알려준 기본 세팅 작업 후(db 연동 및 encoding)

* ( RedirectAttributes rs )라는 파라미터를 받아오면, redirect를 해도 rs.addAttribute()를 통해 전달 가능

model처럼 따로 보내주는것을 명시 안해도, redirect면 넘어간다.

 

* 세션명들은 공통파일에서 따로 관리해도 효율적이다 (해당 컨트롤러에서 공통파일을 상속받아 사용 가능)

ex) common파일을 생성 후, 해당하는 common파일에 각 세션들의 키명을 변수로 지정해놓고, 꺼내와서 사용

 

*mapper.xml 파일 안에서도 if문 등을 사용 할 수 있다

<if test="조건">sql문</if>을 사용하여, 예를들어 같은 select문인데 조금 다른 경우 사용

@Param("변수명") String id : 해당하는 부분은 dao부분에서 mapper.xml로 보내준다.

 

 

header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
	<style type="text/css">
		ul li{ display: inline; padding: 0 10px;}
	</style>
</head>
<body>
	<div align="center">
		<h1 style="color: burlywood; font-size: 60px; font-family: Gabriloa;">
			CARE &nbsp; LAB	
		</h1>
	</div>
	<div align="right">
		<hr>
		<c:set var="log" value='<%=session.getAttribute("id") %>' />
		<c:choose>
			<c:when test="${log eq null }">
				<ul>
					<li><a href="/root/index">HOME</a></li>
					<li><a href="/root/member/login">회원 정보</a></li>
					<li><a href="/root/member/login">로그인</a></li>
				</ul>
			</c:when>
			<c:otherwise>
				<ul>
					<li><a href="/root/index">HOME</a></li>
					<li><a href="/root/member/info">회원 정보</a></li>
					<li><a href="/root/member/logout">로그아웃</a></li>
				</ul>
			</c:otherwise>
		</c:choose>

		<hr>
	</div>
</body>
</html>

 

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div align="center">
		<table>
			<tr>
				<td align="center">
					<h3>내 사전에 불가능은 없다<br>
						불가능은 소극적인 자의 환영이며<br>
						비겁한 자의 도피처 이다.<br>
					</h3>
				</td>
			</tr>
			<tr>
				<td align="right">
					<h3>- 나폴레옹</h3>
				</td>
			</tr>
		</table>
	</div>
</body>
</html>

 

footer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div align="center" style="padding-top: 100px">
		<hr>
		<i style="color: pink; font-size: 30px; font-family: Gabriola;">
			Copyright © CARE Lab. All rights reserved.
		</i>
	</div>
</body>
</html>

 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:import url="default/header.jsp"></c:import>
	<c:import url="default/main.jsp"></c:import>
	<c:import url="default/footer.jsp"></c:import>
</body>
</html>

 

HomeController.java

package com.care.root;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		logger.info("Welcome home! The client locale is {}.", locale);
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		return "home";
	}
	@GetMapping("index")
	public String index() {
		return "index";
	}
}

 

MemberController.java

package com.care.root.member.controller;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

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 org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.care.root.member.dto.MemberDTO;
import com.care.root.member.service.MemberService;

@Controller
@RequestMapping("member")
public class MemberController {
	@Autowired MemberService ms;
	
	@GetMapping("login")
	public String login() {
		return "member/login";
	}
	
	@PostMapping("successLogin")
	public String check(MemberDTO dto, HttpServletRequest req, Model model) {
		int result = ms.check(dto);
		if (result == 1) {
			HttpSession session = req.getSession();
			session.setAttribute("id", dto.getId());
			model.addAttribute(session);
			return "member/successLogin";
		}else {
			return "redirect:login";
		}
	}
	@GetMapping("logout")
	public String logout(HttpServletRequest req, Model model) {
		HttpSession session = req.getSession();
		session.invalidate();
		return "index";
	}
	@GetMapping("info")
	public String info(Model model) {
		ArrayList<MemberDTO> info = ms.info();
		model.addAttribute("info", info);
		return "member/info";
	}
	@GetMapping("memberInfo")
	public String memberInfo(@RequestParam("id") String id, Model model) {
		ArrayList<MemberDTO> memberInfo = ms.memberInfo(id);
		model.addAttribute("memberInfo", memberInfo);
		return "member/memberInfo";
	}
	@GetMapping("register")
	public String register() {
		return "member/register";
	}
	@PostMapping("registerSuccess")
	public String registerSuccess(MemberDTO dto) {
		int result = ms.registerSuccess(dto);
		if (result == 1) {
			return "redirect:login";
		}
		return "redirect:register";
	}
}

 

MemberService.java

package com.care.root.member.service;

import java.util.ArrayList;

import com.care.root.member.dto.MemberDTO;

public interface MemberService {
	public int check(MemberDTO dto);
	public ArrayList<MemberDTO> info();
	public ArrayList<MemberDTO> memberInfo(String id);
	public int registerSuccess(MemberDTO dto);
}

 

MemberServiceImpl.java

package com.care.root.member.service;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.care.root.member.dto.MemberDTO;
import com.care.root.mybatis.member.MemberMapper;

@Service
public class MemberServiceImpl implements MemberService{
	@Autowired MemberMapper mm;
	
	public int check(MemberDTO dto) {
		ArrayList<MemberDTO> list = mm.check();
		System.out.println(list.get(0).getId());
		System.out.println(list.get(0).getPw());
		System.out.println(list.get(1).getId());
		System.out.println(list.get(1).getPw());
		System.out.println("입력 id : " + dto.getId());
		System.out.println("입력 pw : " + dto.getPw());
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).getId().equals(dto.getId()) && 
					list.get(i).getPw().equals(dto.getPw())) {
				return 1;
			}
		}
		return 0;
	}
	public ArrayList<MemberDTO> info() {
		ArrayList<MemberDTO> info = mm.check();
		return info;
	}
	public ArrayList<MemberDTO> memberInfo(String id) {
		ArrayList<MemberDTO> memberInfo = mm.memberInfo(id);
		return memberInfo;
	}
	public int registerSuccess(MemberDTO dto) {
		int result = mm.registerSuccess(dto);
		return result;
	}
}

 

MemberDTO

package com.care.root.member.dto;

public class MemberDTO {
	private String id;
	private String pw;
	private String addr;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
}

 

MemberMapper.java

package com.care.root.mybatis.member;

import java.util.ArrayList;

import com.care.root.member.dto.MemberDTO;

public interface MemberMapper {
	public ArrayList<MemberDTO> check();
	public ArrayList<MemberDTO> memberInfo(String id);
	public int registerSuccess(MemberDTO dto);
}

 

MemberMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.care.root.mybatis.member.MemberMapper">
<resultMap type="com.care.root.member.dto.MemberDTO" id="member">
	<id property="id" column="id"/>
	<result property="pw" column="pw" />
	<result property="addr" column="addr" />
</resultMap>
	<select id="check" resultMap="member">
		select * from membership
	</select>
	<select id="memberInfo" resultMap="member">
		select * from membership where id=#{id}
	</select>
	<insert id="registerSuccess">
		insert into membership (id, pw, addr) values(#{id}, #{pw}, #{addr})
	</insert>
</mapper>

 

register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:import url="../default/header.jsp" />
	<div align="center">
		<h2>회원등록</h2>
		<form action="registerSuccess" method="post">
			<input type="text" name="id" placeholder="아이디"><br>
			<input type="text" name="pw" placeholder="비밀번호"><br>
			<input type="text" name="addr" placeholder="주소"><br>
			<input type="submit" value="회원가입">
		</form>
	</div>
	<c:import url="../default/footer.jsp" />
</body>
</html>

 

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:import url="../default/header.jsp" />
	<div align="center"><h1>로그인 페이지 입니다</h1></div>
	<div align="right">
		<form action = "/root/member/successLogin" method="post">
			<table>
				<tr>
					<td>
						<input type="text" name="id" placeholder="아이디">
					</td>
					<td rowspan="2">
						<input type="submit" value="로그인"style="width:60px;height:55px;">
					</td>
				</tr>
				<tr>
					<td><input type="text" name="pw" placeholder="비밀번호">
					</td>
				</tr>
				<tr>
					<td colspan="2" align="left">
						<a href="/root/member/register">회원가입</a>
					</td>
				</tr>
			</table>
		</form>
	</div>
	<c:import url="../default/footer.jsp" />
</body>
</html>

 

successLogin.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:import url="../default/header.jsp" />
	<div align="center"><h1>로그인 성공</h1></div>
	<c:import url="../default/footer.jsp" />
</body>
</html>

 

info.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:import url="../default/header.jsp" />
	<div align="center">
		<h2>회 원 정 보</h2>
		<table border="1">
			<tr>
				<td align="center" style="width: 150px">아이디</td><td align="center" style="width: 150px">비밀번호</td><td align="center" style="width: 150px">주소</td>
			</tr>
			<c:forEach var="info" items="${info}">
				<tr>
					<td><a href="/root/member/memberInfo?id=${info.getId()}">${info.getId()}</a></td><td>${info.getPw()}</td><td>${info.getAddr()}</td>
				</tr>
			</c:forEach>
		</table>
	</div>
	<c:import url="../default/footer.jsp" />
</body>
</html>

 

memberInfo.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:import url="../default/header.jsp" />
	<div align="center">
		<h2>${memberInfo[0].getId() } 정 보</h2>
		<table>
			<tr>
				<td align="center" style="width: 150px">아이디</td><td align="center" style="width: 150px">${memberInfo[0].getId() }</td>
			</tr>
			<tr>
				<td align="center" style="width: 150px">비밀번호</td><td align="center" style="width: 150px">${memberInfo[0].getPw() }</td>
			</tr>
			<tr>
				<td align="center" style="width: 150px">주소</td><td align="center" style="width: 150px">${memberInfo[0].getAddr() }</td>
			</tr>
		</table>
	</div>
<c:import url="../default/footer.jsp" />

</body>
</html>

 

실행 결과

 

 

 

 

 

 

intellij 설치

https://www.jetbrains.com/ko-kr/idea/download/ - Intellij IDEA Community Edition 설치 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

intellij 프로젝트 생성

https://start.spring.io/ - Gradle - 3.2.5 - java버전 설정(17) - Dependencies - Spring Web, Thymeleaf 추가 - GENERATE

open folder - (설치한 폴더 - build.gradle)선택 - Open as Project

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

intellij 설정

terminal - ./gradlew clean  을 통해 gradle 초기화

File - Project Structure - SDK - 17버전 설정

시스템 환경 변수 편집 - 환경 변수 - 시스템 변수 - 새로 만들기

- (변수이름 : JAVA_HOME, 변수 값 : jdk-17경로)

시스템 환경 변수 편집 - 환경 변수 - 시스템 변수 - Path - 새로 만들기

- jdk-17\bin경로 추가

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts