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

DaramGee·2024년 1월 3일
0

복습

✅ Spring AOP (Aspect-Oriented Programming) 는 공통 관심사를 분리하여 관리하는 프로그래밍 접근방법이다.(관점지향프로그래밍 지원 기술)


  • 메소드 안의 기능을 핵심기능, 부가기능으로 나누었을 때, 부가기능을 공통된 하나의 장소에 모아서 관리하는 방식이 AOP 방식이다.

  • 부가기능 : 보안, 로깅(사용자 접속내용 기록), [[트랜잭션]]관리(커밋, 롤백)

  • 수평적 관점(횡단 관심사 cross-cutting concerns): 동등한 관점

  • 예시 설명: 예를 들어, 프로그램에 로깅 기능이 필요한데 이를 모든 코드에 반복해서 작성하는 대신, AOP를 사용하여 로깅 기능을 한 곳에서 관리하고 다른 코드에 적용할 수 있습니다.

  • <->[[OOP]]가 객체를 중심으로 데이터와 기능을 구성한다면, AOP는 부가기능(advice)을 동적으로 추가해주는 기술이 필요하였다. (공통된 관심사)


  • 관련 용어

  • target : advice(부가기능)가 추가될, 필요한 객체(반복되는 코드가 들어있어서 분리가 필요한 클래스)
  • advice(부가기능) : target에 동적으로 추가될 기능 -> 따라서 어노테이션 제공됨
  • joinpoint : advice가 추가(join)될 대상이 되는 메소드
  • pointcut : joinpoint를 정의한 패턴-정규식(pointcut execution), 간섭을 하겠다고 표시!!(일괄처리, 자동)
    - around로 걸어줄 때 excution 사용
java.util.regex.*
@Around("execution(* com.example.demo.*Logic.cud*(..))")
어떤 반환타입이든지/패키지명/Logic으로 끝나는 클래스/cud로 시작하는 메소드들/매개변수 상관없음

예 : cudEmp, cudBoard, cudNotice(o) / getBoardList, getNoticeList(x)

@Around("execution(* com.example.*.*(..))")
  • proxy : 스프링에서 aop를 자동으로 설정하기 위해 필요

  • 관련 어노테이션

  • (Advice종류-메소드 앞에 위치)
  • @Around : 메소드 시작, 끝부분 모두 감쌈(around advice)
  • @Before : 메소드 시작 부분(before advice)
  • @After : 메소드 끝부분(after advice)
public class BoardLogc{
	//아래 패턴에 일치하면 전에 con.setAutoCommit(false) 
	//후에 con.setAutoCommit(ture) 자동으로 붙여진다. 
	@Around("execution(* com.example.demo.*Logic.cud*(..))")
	public String anyMethod(){
	}
}
  • try-catch문에서 사용할 땐?
try{
	methodA()
	@AfterReturning // 예외 방생하지 않았을 때  부가기능에 붙임 
	} catch(){
	@AfterThrowing  //예외 발생했을 때 부가기능에 붙임
   }

  • weaving(꿰매기)

  • Target 앞뒤에 advice추가하여 Proxy를 생성하는 것
  • Proxy는 @EnableAspectJAutoProxy 를 붙이면 자동으로 생성됨.

강의 내용

회원게시판

  • 회원정보 수정 (입력값으로 업데이트)

  • post 방식
    - 바이너리파일 전송 시, Form-data로 선택하여 테스트 한 뒤 전송
    - <form method="post" enctype = "multipart/form-data"> - 바이너리타입 제외 시, x-www-form-urlencoded -


    - js코드에서 값을 넘겨 받을 때, row 사용(js로 제공하는 오브젝트타입 전송 시, 비동기통신 처리 시)
    - (참고 : https://moonhy7.tistory.com/entry/Ajax-08)
    - {"mem_id" : "kiwi", "mem_pw" : "123"}

  • 개발 전 작업

  • 목업 작업(Mock-up) or JUnit

  • 회원가입 & 파일첨부

  • Post & form-data

  • xml 설계 관련

  • 우리는 DB관리는 myBatis를 통해 하고 있었음. 파일추가 기능을 위해 DB 설정을 확인한 뒤 null에 대한 처리가 필요하다.

  • 파일만 업로드 될 경우, 500번 에러가 발생할 수 있다.

  • myBatis는 동적 처리도 가능하니까 xml에 if문을 넣어서 맏늘 수 있음.

  • insert null 데이터 관련 처리 필요(mem_no, mem_id가 null 아님으로 설정되어있음.)

  • [[mybatis-3-user-guide_ko.pdf]]

<insert id="insertAuthor" parameterType="domain.blog.Author"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 </selectKey> insert into Author (id, username, password, email,bio, favourite_section) values (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR} ) </insert>
  • xml의 업데이트에 들어갈 수 있는 데이터 확인


댓글처리 자료구조 설계

  • 구조 설계

  • 원글 & 댓글 & DB 설계에 어떻게 그려져야 하는가?
  • 상세보기 1건, 댓글 n건
        List<Map<String,Object>> boardDetail = new ArrayList<>();
        Map<String,Object> dmap = new HashMap<>();
        dmap.put("b_title","5개월 PT권 양도합니다.");
        dmap.put("b_content","갑자기 지방발령으로 양도합니다. 원하시면 아래 이메일로 연락바랍니다.");
        dmap.put("b_date","2024-01-03");
        boardDetail.add(dmap);
        List<Map<String,Object>> commentList = new ArrayList<>();
        Map<String,Object> rmap = new HashMap<>();
        rmap.put("bc_writer","키위");        
        rmap.put("bc_comment","혹시 몇회가 남은 건지 궁금합니다.");        
        commentList.add(rmap);
         rmap = new HashMap<>();
        rmap.put("bc_writer","사과");        
        rmap.put("bc_comment","혹시 5개월동안 헬스도 이용이 가능한 걸까요?.");        
        commentList.add(rmap);
         rmap = new HashMap<>();
        rmap.put("bc_writer","바나나");        
        rmap.put("bc_comment","혹시 사용기간이 제한되어 있는 걸까요?.");        
        commentList.add(rmap);
        if(commentList.size()>0){
             Map<String,Object> cmap = new HashMap<>();
             cmap.put("comments", commentList);
            boardDetail.add(1, cmap);
        }


강의 마무리

  • 리액트 파일처리

  • formdata, www, row 세 방법 섞어가며 사용할 일 있음.

  • 게시판 구현 단계

  • 1단계 : 테이블 한개로 crud
  • 2단계 : 테이블 두 개 crud, 작성자 정보를 세션을 통해 자동으로 처리 가능 -> 세 테이블 조인 연습
  • 3단계 : n개 테이블 처리, 게시판 솔루션으로 처리(4개 이상-qna, 공지사항, 자유게시판, 회원집합, 첨부파일 테이블 )

JPA 잘 사용하기 위해선 2단계까지의 마스터는 필요하다 JPA에서 테이블이 아닌 클래스 설계로 테이블 자동 생성됨 .
MyBatis와 다른 점, sql문이 보이지 않고, sql 튜닝 불가능 -> 대용량 DB 설계 어려움

0개의 댓글