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