[2023.12.29] 개발자 교육 69일 차 : 강의-Spring Boot 실습 [구디 아카데미]

DaramGee·2023년 12월 30일
0

복습

@어노테이션

컨트롤계층 지원 어노테이션 -> 웹 요청을 받고 적절한 응답을 반환하는 역할

@Controller -> 페이지로 출력

  • 메소드 이름이 페이지 이름이 됨.
  • 화면 직접 처리 시 사용
  • Model 클래스와 함께 사용
  • @RequestMapping + @ Controller -> WebServlet임!

@RestController -> 문자열로 출력

  • [[mime type]] : 아래의 경우 사용(페이지 출력 아닌 모든 경우) <- Model 사용 필요 x
    - text/plain
    - application/json
  • back front의 완전한 분리를 지원하는 설계(UI, JSON 활용 필요 시 사용)
  • 이 어노테이션이 붙은 클래스 메소드의 리턴타입은 String이다.
  • 주의, 절대 redirect나 forward 붙이지 말 것!!
  • 세션을 주입받을 수 있다 -> 상태관리([쿠키], [[Session]](서버 cache메모리) -> 타임라인 존재)

@XXXController 뒤에 괄호를 넣어 빈의 이름을 설정할 수 있으나, 클래스 이름과 동일하게 입력하는 것 필요(P.928)
왜? 이름을 다르게 할 경우, 클래스를 찾는 과정에서 충돌이 일어날 수 있음. 따로 입력을 하지 않는 경우, default로 클래스 이름으로 생성이 됨.
예 : @Controller("noticeController")


강의 내용

Git 가이드

  • 머지 merge 방법

  • fast-forward : 커밋이 생기지 않고, 실행하는 브랜치의 head가 병합되는 head commit 이동 방식(현재의 커밋을 대상 브랜치의 커밋까지 옮기는 방식)
  • 주의사항 : 마스터 브랜치에서 커밋, 머지 하지 말 것, 기본적으론 Fastforward merge가 되도록 설계
  • 단, 히스토리를 보고 싶다면 커밋머지 형식으로 진행 but 가급적이면 master로 ==리버스==를 한 뒤 머지를 함. (위의 머지 형식이 옳음)

회원가입 및 우편번호 처리

  • 우편번호 처리

  • 다음 우편검색 api 활용
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
  • 화면

로그인 & 로그아웃 처리

  • 로그인 성공시 form 생성(In gymHeader.jsp)

  • 로그인이 성공한 유저의 경우, 우측 상단에 가져온 닉네임 & 로그아웃버튼 생성 => if문 형식으로 작성
  1. 세션 있는지 비교한다 - if문을 넣기 위해 스크립틀릿 넣기! if문으로 전체 1~3을 감싸야함.
  2. 로그아웃 디자인 코드 넣기!
  3. 이벤트 처리하는 코드 넣기 -> 자바스크립트(DOM을 스캔해야 접근할 수 있으니)
<%--스크립틀릿--%>  
<%  
  if(nickname != null){  
%>  
<%--디자인코드--%>  
<form class="d-flex mb-2 mb-lg-0" role="search">  
  <div class="me-auto mt-2 mb-lg-0"><%=nickname %>님.&nbsp;</div>  
  <input type="button" class="btn btn-outline-success" onclick="logout()" value="로그아웃">  
</form>  
<%--이벤트처리 코드 --%><script>  
  const logout = () => {  
    location.href="/auth/logout";  
  }  
</script>  
<%  
  }  
%>
  • 로그아웃

  • 화면에 로그아웃 버튼 클릭 -> js 처리 필요! 세션을 몽땅 비움 Invalidate 그런데 세션은 KakaoConroller에서 생성했음.
  • jsp(header.jsp) -> action(onclick) -> jsp(logout.jsp) -> 세션 삭세 & index.jsp로 이동

회원 관리 코드 설계

  • DB 생성(Member.java)

  • 회원가입한 회원 정보 관리를 위한 DB 생성
  • 테이블 및 시퀀스 생성
테이블
create table member231228(  
    mem_no number(5) constraints member231228_no_pk primary key,  
    mem_id varchar2(50) not null,  
    mem_pw varchar2(10),  
    mem_name varchar2(30),  
    zipcode varchar2(10),  
    address varchar2(100)  
)

시퀀스 
CREATE SEQUENCE SCOTT.SEQ_MEMBER231228_NO
  START WITH 1
  MAXVALUE 99999
  MINVALUE 0
  NOCYCLE
  NOCACHE
  NOORDER;
  • 시퀀스?

    ✅ 유일한 순차적인 숫자를 생성하는 데이터베이스 객체

  • 주로 식별자(Primary Key) 값 생성에 사용
  • 시퀀스는 특정 테이블의 하나 이상의 열에 대해 자동으로 값을 생성하며, 보통 테이블의 기본 키 값으로 사용
  • 자동으로 값이 생성되기 때문에, 다수의 사용자가 동시에 데이터를 추가하는 경우에도 중복되지 않는 고유한 값이 보장
  • 안전한 채번이 가능(Exception 있어도 처리->예매, 연번 등)

대규모 데이터베이스 시스템에서 성능을 향상시키고 식별자의 고유성을 유지하는 데 도움

  • 여기서 mem_no는 화면에서 입력받는 값이 아니라 오라클 시퀀스로 입력받는 값임.
  • 채번된 숫자를 유지해야한다 왜? board_master 테이블 사용 번호를 첨부파일 등록하는 board_sub테이블에도 한번 더 사용해야하기 때문이다!!
  • Insert메소드를 통해 성공하면 1, 실패하면 0을 반환받음. 그 result가 필요한 것이 아니고, Insert된 정보는 no를 통해 꺼내와야하니, 파라미터에 잘 담아둔다.
  • 그러기 위해서 xml에 useGeneratedKeys를 true로 하면서, 컬럼명과 사용명을 표기한다. (default는 false임)

useGeneratedKeys!

✅ [[MyBatis]] insert 시 id 값 가져오기 (useGeneratedKeys, keyProperty)


  • XXX.xml 파일에 insert 문을 넣을 때, 두 구문을 추가한다.
  • insert 될 때의 파라미터 값에서 저장해 두고 싶은 id를 표시해두어서 키를 생성하는 것을 설정해 둘 수 있다.
  • 언제 쓰느냐? 저장해 둔 키값을 활용해서 다른 메소드를 실행할 수 있다.

  • XXX.xml 파일에 insert 문을 넣을 때, 두 구문을 추가한다.

  • insert 될 때의 파라미터 값에서 저장해 두고 싶은 id를 표시해두어서 키를 생성하는 것을 설정해 둘 수 있다.

  • 언제 쓰느냐? 저장해 둔 키값을 활용해서 다른 메소드를 실행할 수 있다.

  • DB 테이블이 1:n 관계면???

  • 테이블이 1:N의 관계이고 2개 이상의 테이블에 Insert 처리는? useGeneratedKeys 사용

  • memberInsert() 메소드에서 해당 예시를 자세히 확인해보자

  • xml에도 useGenerateKeys를 사용하기 위해 true로 작성해야함.

  • 또 한 명이 입력하던 중에 다른 사람의 데이터가 또 들어오면 충돌이 일어날 수 있으니, 채번한 번호를 가져오자마자 다른 테이블에도 더할 때 사용할 수 있다.

<insert useGeneratedKeys="true" id="memberInsert" parameterType="map" keyColumn="mem_no" keyProperty="mem_no">  
    Insert into MEMBER231228(mem_no, mem_id, mem_pw, mem_name,  
                             zipcode, address, mem_email, gubun)    VALUES(SEQ_MEMBER231228_NO.nextval,#{mem_id},#{mem_pw},#{mem_name},           #{zipcode},#{address},#{mem_email},#{gubun})</insert>

Map vs VO 데이터 뭐로 받아야 하나?

  • 리턴타입으로 둘을 선택해서 사용하는 기준이 있나?

  • Map : 사이즈 제한 없음, Exception 발생 가능(NumberFormat, Cast 등)
  • VO : 사이즈 제한 있음(컬럼 매번 추가해야함), 타입이 이미 정해두는 것이라 따로 형전환코드 필요 없음.
  • 각 메소드별 파라미터, 리턴타입에 대한 설정과 db와 연결할 쿼리문을 미리 생각해보자!
  • 회원가입 메소드는 @param : Map / @return : int(1 : 입력성공, 0 : 입력 실패)
  • 회원목록 구현 메소드는 @param : 조건 검색에 사용될 컬럼명, 키워드 받아오기 / @return : n건 조회되면 List, List<Member(VO)>

강의 마무리

  • 리액트 @RequestBody 쓸 때 row에 담아 보내기

0개의 댓글