1. MyBatis
    1. <!CDATA[]]> : 특수문자를 쿼리 내에서 사용하는 경우 쿼리태그(<,>)와 같기 때문에 그 자체를 CDATA태그에 넣어서 문자 자체로 만들어줘야함
    2. 쿼리문은 <sql id=”” />태크를 이용해 작성하고 <include refid=”” />를 통해 불러와서 사용할 수 있다.
    3. #{id} : 만약 User에 대한 쿼리문이라면 User.getId()를 수행하는 것과 같다.
    4. resultType : 클래스 자체를 가져와 참조함(예 : User);
    5. resultMap : 원하는 명이나 카멜케이스를 사용하지 않기 위해 사용함(column = DB에서의 이름 / property = Java코드의 model 또는 Entity 이름)
  2. Login Level
    1. ERROR
      1. 프로그램 동작에 큰 문제 발생, 죽시 문제 조사해야하는 수준
      2. 예 : DB사용불가, 주요 에러 계속 발생
    2. WARN
      1. 주의해야하지만 프로세스는 진행되는 상태
      2. 명확한 문제 : 현재 데이터 사용 불가, 캐시값 사용
      3. 불명확한 문제 : 개발모드로 프로그램 시작 등
    3. INFO
      1. 중요한 비즈니스 프로세스가 시작 또는 종료에 대한 내용(정보성 메세지)
    4. DEBUG
      1. 개발자가 기록할 가치가 있는 정보를 남기기 위해 사용하는 레벨
    5. 로그레벨 순서
      1. TRACE > DEBUG > INFO > WARN > ERROR > FATAL
      2. TRACE : DUBUG보다는 상세한 정보
      3. FATAL : 아주 심각한 에러, 프로그램 작동 불가능
  3. 의존 객체 자동 주입
    1. @Resource(Java 어노테이션, 특정 프레임워크 종속X)
      1. 찾는 순서 : 이름 → 타입 → @Qualifier → 실패
      2. 사용 가능한 위치 : 멤버 변수, setter 메소드
    2. @Autowired(Spring 어노테이션)
      1. 찾는 순서 : 타입 → 이름 → @Qualifier → 실패
      2. 사용 가능한 위치 : 멤버변수, setter 메소드, 생성자, 일반 메소드
    3. @Inject(Java 어노테이션, 특정 프레임워크 종속X)
      1. 찾는 순서 : 타입 → @Qualifier → 이름 → 실패
      2. 사용 가능한 위치 : 멤버변수, setter 메소드, 생성자, 일반 메소드
    4. @Qualifier
      1. 만약 타입이 동일한 Bean객체가 여러개있으면 Spring이 Exception발생시킴 (예 : @Autowired를 동일한 타입에 쓴 곳이 있을 때)
      2. 스프링 입장에서는 어떤 Bean을 주입해야 할지 모름
    5. Inject와 Autowired의 차이 참조 : https://velog.io/@sungmo738/Resource-Autowired-Inject-차이
  4. STATUS CODE
    1. 100번대 : 현재 데이터의 처리 중인 상태
      1. 100 : 데이터의 일부를 서버가 받은 상태
    2. 200번대 : 정상적인 응답
      1. 200 : 에러없이 정상처리
      2. 204 : 정상 처리되었으나 서버에서 보내줄 데이터가 없음
    3. 300번대 : 다른 URL처리
      1. 301 : 요청된 페이지가 새로운 URL로 변경되었음
      2. 304 : 이미 기존의 데이터와 변경된 것이 없음
    4. 400번대 : 서버에서 인식할 수 없음(요청의 오류)
      1. 400 : 전송된 Request에 문제가 있어서 서버가 인식할 수 없음
      2. 403 : 서버에서 허락되지 않음, 서버가 허용하지 않는 웹페이지
      3. 404 : URL에 해당하는 자원을 찾을 수 없음(NOT FOUND)
      4. 406 : 전송 방식이 허락되지 않음(REST에서 자주 발생)
    5. 500번대 : 서버 내부의 문제
      1. 500 : 서버에서 처리 시 문제가 발생
      2. 502 : 게이트웨이나 프록시 상태의 문제(과부하 등)
      3. 503 : 일시적인 과부하나 서비스 중단 상태
      4. 504 : 지정된 처리시간이 지나서 처리되지 못함
  5. 어노테이션
    1. @AllArgsConstructor(모든 매개변수 받는 생성자)
      1. Bean 주입방식과 관련이 있으며, 생성자로 Bean 객체를 받는 방식을 해결해주는 어노테이션, 이를 사용하면 객체를 주입받을 때 @Autowired 같은 특별한 어노테이션 필요X
    2. @NoArgsConstructor(매개변수가 없는 생성자)
      1. 파라미터 없는 기본 생성자를 추가하는 어노테이션
    3. @Transactional : 선언적 트랜잭션이라고 부르며, 트랜잭션을 적용하는 어노테이션
    4. @Entity : 테이블과 매핑되는 엔티티라고 알려주는 어노테이
    5. @Getter : 모든 필드에 getter를 생성해주는 어노테이션
    6. @Setter : 모든 필드에 setter를 생성해주는 어노테이션, 무분별한 사용은 안정성 떨어트림
    7. @Data : getter와 setter를 모두 생성해줌
    8. @Builder : setter어노테이션 사용 대신 빌더 패턴을 사용하면 안정성이 보장되며 맴버변수의 가변성에 대응이 가능함
  6. 패키지별 역할
    1. controller
      1. URL과 실행함수를 매핑
      2. 비즈니스 로직이 있는 service를 호출하여 비즈니스 로직 처리
      3. 반환할 템플릿을 정의 및 JSON 등으로 응답
    2. service
      1. 비즈니스 로직을 구현
      2. 데이터 처리를 담당하는 mapper에서 데이터를 가져와서 controller에 넘겨주거나, 비즈니스 로직을 처리
    3. entity
      1. DB테이블과 매핑되는 객체를 정의
    4. mapper
      1. 데이터를 가져오거나 조작하는 함수를 정의
  7. Oauth2 찾아보고 정리하기
  8. 엑셀파일 INSERT 하는 방법
    1. 엑셀 파일을 읽기 위해서는 아파치에서 제공하는 poi라이브러리를 사용해야 함
    2. 확장자 유효성 검사
      1. FilenameUtils.getExtension(file.getOriginalFilename()).toLowerCase()로 xlsx, xls와 일치하는 지 확인
      2. file.getFile().getContentType()을 ConstContentType.XLSX와 일치하는 지 확인
      3. 첫번째 보다는 두번째가 확실함 확장자 이름만 바꾸는 경우도 있기 때문임
    3. 대략적인 로직
      1. 파라미터에서 파일이 있는지 확인 → 없으면 에러 리턴
      2. 확장자가 엑셀인지 확인 → 아니라면 에러 리턴
      3. 엑셀데이터를 가져와서 각 행마다 VO객체에 저장 → list에 저장
      4. list를 DB에 INSERT
    4. 참고 : https://sowon-dev.github.io/2021/08/09/210810Spring-excel/ 엑셀DB