프로젝트 Remind
1. 순서
생성
- 백 + 프론트 연동용 폴더 생성
- 톰캣 컨피그 확인
- 톰캣 프로젝트 추가
- 콘텍스트 홈 (/)
- 어노테이션 프로세싱
세팅
- 자바버전, 그레이들 변수 추가
- 스프링, AOP 추가
- 로그 라이브러리, 한글 처리 라이브러리, 롬복 라이브러리(어노테이션으로 생성자, getter/setter 정의), jackson 추가
- 테스트용 롬복
- 테스트(자바를 위한)에는 spring이 포함되지 않기에, spring test를 추가
- DB용 라이브러리 추가
- DB가 정상적인지 먼저 확인 (db가 잘 있는지, 사용자로 들어가서 connection을 확인해보기)
mybatis, hikari(DB 요청을 위해 따로 빼놓는 특정 스레드, connection pool 세팅) 추가
- 라이브러리 다운이 잘 되었는지 확인(build)
- DB를 확인하기 위해 log4j와 jdbc를 연동
- 보안용 Security tag, config, core, web용 라이브러리 추가
- 자바 웹토큰(JWT) 추가
자바 main(testx)을 위한 리소스
application.properties 설정
- 꺼내오는 annotation: @Value
- JDBC에 국한되지 않은 환경변수 파일임
log4j.xml 로그 설정
- 왜 로그가 중요한가? 정확한 일시에 요청과 응답에 대한 기록이 남음, 어느 시점에 어떤 원인으로 프로그램이 죽었는지 파악할 수 있음 등등
- console 세팅, 패턴 레이아웃 / 어떤 범위(level)로 볼 것인지
- root logger: 없으면 에러, 기본 밸류를 설정하는 역할
- log4j: 전체 로그 환경 설정, log4j2: jdbc용 로그 환경 설정
mybatis 설정
- mapper를 쓰면 쿼리 매핑이 잘 됨, 추가적인 확장 기능(VO들(domain 패키지)을 별칭으로 불러오기 위한 typeAliases 등)이 들어감.
톰캣 돌려보고 문제 없는지 확인
Servlet을 통한 Spring 셋업 - config 패키지
- rootConfig
@Configuration: 앱이 시작될 때 가장 먼저 불러와지는 환경설정 bean들
@PropertySource, @Value -> 환경변수를 불러와 쓸 수 있음
application Context (Autowired 됨)
dataSource에 히카리 - connection pool까지 함께 세팅하기 위함
sqlSessionFactory - mybatis를 위한, 기본적으로 jdbc만 쓰는데, mybatis용을 위해 빈 설정
transactionManager
spring과 db의 연동을 위한 rootConfig (웹에 대한 config 없이, db 연동만으로 앱을 실행할 수 있음, servlet이 기본적으로 동작하고, spring이 있으면서 jdbc도 있으므로 바로 자바 app으로 사용 가능함)
cf. autowired
web application context는 application context이므로, servlet만 돌아가고 있어서(라우팅X)
-
ServletConfig
web mvc를 쓰기 시작함. @EnableWebMvc
@ComponentScan - component는 web mvc에서 사용하는 bean임. (exception, controller를 스캔함)
viewController - 루트 밑 모든 뷰들을 라우팅.
addResourceHandlers - 뷰 스캔(뷰 컨트롤러)에서 제외되는 파일들을 제외해주는 역할. 라우팅에서 제외해서 직접 접근을 막음.
spring에서 스캔하는 대상은 bean, component, config // web config 해주지 않고 servelt만 하는 상황에서는 ??????
-
WebConfig
security config 연결
파일 업로드 설정 -> customizeRegistration (커스터마이즈 기능으로 multipartConfig (파일 업로드)를 추가함)
exception
CommonExceptionAdvice
- @ControllerAdvice: AOP(횡단적이되 범위 지정 가능, 반드시 모든 joinpoint에 꽂힐 필요는 없음. advice/filter 클래스로 많이 만듦)가 controller 영역까지 동작하게 함
cf. semantic component: 의미를 지정한 component, ex. controller component
- exception scan이 되는 순간 advice로서 동작하게 됨. componentScan이 servlet config에 있음.
board
무엇을 복사해서 넣었는지 생각하기
BoardController
BoardMapper
- db와 가장 밀접한 관계
- mybatis
- db로서 어떤 객체를 가져와야 할지가 에러 -> db에 있는 하나의 row가 자바의 하나의 객체에 대응함. = VO
VO를 실제로 만들어주기 위해서 domain package에서 BoardVO와 BoardAttachmentVO를 가져옴 (common util에서 업로드 파일 기능 & 업로드파일네임 기능 & webConfig에서 multipart 기능 추가)
어떤 VO를 쓸지 정해줬으므로, mybatis를 실제로 쿼리문을 저장할 때 2가지 방식이 있음.
- xml 파일 (resource 폴더 안의 org 폴더 안의 scoula 폴더 안의 board 폴더 안의 mapper 폴더 안에 들어있음) -- copy로 경로 확인 가능
select, delete 등 태그들은 mybatis에서 정의되어 있는 태그이므로 다른 것을 쓰면 안됨
- mybatis 어노테이션 (@Select 등 --> 매퍼가 됐기 때문에 쓸 수 있는 것)
- resultType으로 VO 직접 작성 가능. mybatis config에서 typeAliase로 지정해줬기 때문임.
파라미터 타입, 리설트 타입 등이 적혀있음.
- db와 테이블이 잘 있는지 확인해주기
service 레이어에서 쓸 board.DTO
VO: db 접근 객체 / DTO: 레이어 간 transfer해주는 객체
of 메소드
- 다른 타입을 이 타입으로 변환할 때 자주 씀
- VO -> DTO로 변환하는 of 메소드를 만들어줌
- VO에서 특정 컬럼을 추출해서 DTO로 만듦. row에 있는 컬럼이 5000개라고 할 때 7개만 뽑아 쓸 수도 있는 것.
board.service
BoardService
- 인터페이스
- service에서 쓴 결과를 controller로 한 번 더 올려줄 때 원래는 또다른 DTO를 만들어줘야 하지만(관행적),
우리가 만드는 입력 출력 모두 dto이기 때문에 같은 DTO를 사용한 것임
BoardServiceImpl
- 인터페이스를 오버라이드해서 실제로 사용
controller
servlet config에서 componentscan에서 board controller가 잘 스캔되었는지 확인해야 함.
security.config
permitAll() 모두 허용