Spring #3 - Member

김형우·2022년 2월 28일
0

Spring

목록 보기
4/19

실행 - DB연동까지

1. 생성이후

2. statics

vue로 만들어서 배포할때도 static에 넣는다고 한다.

3. 기본폴더생성

CM 이라고 함. 폴더 세개 생성

4. 검토 순서

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에 들어가는 주소)


구동

1. Boot20220228Application.java

  1. 컨트롤러와 서비스의 위치를 지정한다.
    : @ComponentScan(basePackages = { "com.example.controller", "com.example.service" })
    1-1. 컨트롤러
    : java 구동 시 화면을 표시하거나 REST를 수행 하는 페이지
    1-2. 서비스
    : DB연동 수행부분
    : 서비스는 DB파일(설계도)과 DBImpl파일(수행부분)로 이루어진다
@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!");
	}
}

2. MemberController.java

  1. 컨트롤러 파일임을 명시함
    : @Controller

  2. 이 컨트롤러는 공통적으로 "/member" 아래에 주소를 만든다.
    : @RequestMapping(value = "/member")

  3. /member 라는 주소가 생략되어도 사용 가능함
    : @GetMapping(value = { "/insert" })
    = 127.0.0.1:8080/member/insert

  4. 리턴값은 파일명으로

  5. 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";
    }
}

3. MemberDB.java - 설계도

  1. DB와 연동하는 부분 중 메소드만을 정의하는 설계도 부분
    : 파일 속성을 interface로 해야한다(추상화)
  2. Service라고 하며 이 파일이 Service임을 선언한다.
    : @Service
    : 서비스, 저장소 라고 불린다.
  3. 메소드 설계부분
    3-1. 추가할 내용을 Memer member로 주면
    : insertMember(Member member);
    3-2. 추가한 후에 실제 추가된 내용을 반환한다.
    : public Member
@Service
public interface MemberDB {
    public Member insertMember(Member member);
}

4. MemberDBImpl.java - 구동부

  1. DB연동을 실제로 수행하는 구현부
    : 구현부는 프레임워크에 따라서 안만들수도 있음
  2. Service 파일임을 선언한다.
    : @Service
  3. 추상화 된 설계도를 가져온다(MemberDB.java)
    : implements MemberDB
  4. DB연동
    : MongoDB 라이브러리를 application.properties 에서 사용 설정했기 때문
    4-1. application.properties
    : db 연동
    : spring.data.mongodb.uri=mongodb://id201:pw201@1.234.5.158:37017/db201
    : spring.data.mongodb.database=db201
    4-2. application.properties환경설정으로 생성된 객체 사용
    : @Autowired = mongoDB사용 선언
    : private MongoTemplate mongodb; = 사용변수 설정
  5. mongodb.(위에서설정한변수)를 쓰면 insert, update, find 등 REST로 사용 가능한 면령어들이 나온다. 여기서는 insert 선택!
  6. 타입Member 의 형태로 member라는 변수명으로 데이터를 던짐
    : mongodb.insert(member);
    6-1. 여기서 리턴값이 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;
        }
    }

}

5. insert.jsp

  1. 타임리프 사용 => html에서 반복문, if문 사용가능
    : <html lang="en" xmlns:th="http://www.thymeleaf.org">
  2. Bootstrap 사용
    : <link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap.css}" />
    : <script type="text/javascript" th:src="@{/js/bootstrap.min.js}"></script>
  3. <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>
  1. submit 타입의 버튼을 누르면 form태그 안의 내용이 post라는 메소드를 통해서 컨트롤러로 넘어감.

  1. App에 서비스위치 지정
  2. 컨트롤러
  3. 서비스설계도면 db
  4. 구현부 dbimpl
profile
The best

0개의 댓글