Project

    로깅 도입

    log4j2 도입 터놓고 서비스를 개발하면서 배포환경에서는 콘솔에 로그를 남길 수 없었습니다. 콘솔에 로그를 남기면 휘발되기도 하고 나중에 확인하기 어려웠습니다. 그래서 log파일로 남기기로 결정했습니다. logging 프레임워크 선택 사용할만한 로깅 프레임워크 구현체는 log4j, logback, log4j2 였습니다. 헷갈릴만한 용어정리 sl4j(Simple Logging Facade For Java) 로깅 프레임워크가 아니라 logger의 인터페이스이다. slf4j를 이용하면 코드를 일정하게 유지하면서 구현체의 전환을 통해 다른 로깅 프레임워크로의 전환을 쉽고 간단하게 할 수 있습니다. log4j 가장 오래된 로깅 프레임워크입니다. 2015년 기준으로 개발이 중단되었습니다. logback log4j..

    클라이언트에서 Location header를 찾지 못할 때

    CORS 응답 설정시에 서버측에서 자주하는 실수가 있습니다. 아래 코드로 CORS 응답을 설정해줄 수 있습니다. 하지만 한가지 문제가 발생합니다. @Configuration public class WebConfig implements WebMvcConfigurer { public static final String ALLOWED_METHOD_NAMES = "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,PATCH"; @Override public void addCorsMappings(final CorsRegistry registry) { registry.addMapping("/api/**") .allowedMethods(ALLOWED_METHOD_NAMES.split(",")));..

    [Class Flix] EP 21. Bean Validator 적용

    지금까지는 회원가입이나 강의등록시 올바른 데이터인지 검증하지 않았습니다. 사실 기능은 몇개 넣었는데 잘 모르고 사용했습니다. Validation을 학습하고 실무에서 많이쓰는 방법으로 제 프로젝트에 적용해 보겠습니다. 2021.10.10 - [Web/MVC2] - EP3. 검증1 - Validation EP3. 검증1 - Validation 지금까지 만든 웹 어플리케이션은 사용자가 입력하는 모든 상황을 대비할 수 없습니다. 예를들어, 사용자가 가격을 입력하는 곳에 알파벳을 입력하거나 그냥 입력 창에 공백을 넣게되면 에러페 ksabs.tistory.com 2021.10.14 - [Web/MVC2] - EP4. 검증2 - Bean Validation EP4. 검증2 - Bean Validation EP3. 검..

    [Class Flix] EP 20. messages 적용

    스프링과 타임리프에서는 messages를 편리하게 사용할 수 있도록 여러기능을 제공합니다. 2021.08.20 - [Web/MVC2] - EP2. 메세지와 국제화 EP2. 메세지와 국제화 메시지 현재 HTML의 상품명, 가격, 수량 등 'label'에 있는 단어들을 하드코딩 되어있습니다. 만약에 '상품명'이라는 단어를 '상품이름'으로 바꾸려면 모든 HTML상의 단어들을 바꾸어주어야합니다. ksabs.tistory.com 제 프로젝트의 HTML에서 하드코딩 되어있는 글자들을 messages 기능을 이용해 리팩토링했습니다. 다수의 label 또는 버튼이나 여러 text에 해당하는 부분을 th:text="#{}" 를 이용해 messages.properties에 미리 설정한 글자를 가져올 수 있도록 수정했습니다..

    [Class Flix] EP 19. 타임리프 리팩토링

    Home 검색창에서 태그의 id 들을 th:field로 교체하기 (사이드 이펙트 발생하는지 판단하기) String 타입의 멤버들은 th:field로 지정하면 멤버변수의 이름으로 id, name, value가 자동으로 생성되지만 String 타입이 아닌 Integer 타입 ratingGoe는 값 자체로 지정이 됩니다. 그래서 JS가 동작하지 않는 문제가 발생합니다. 따라서 String 타입의 멤버들만 th:field로 교체해주었습니다. 사이트 이름 강의 이름 강의자 이름 별 점 + - search 검색창의 rating 표시부분의 value 부분을 스프링에서 보내주는 데이터로 바꾸기 검색파라미터들을 다 으로 보내주려 했으나 타입이 다 달랐고 특히 ratingGoe는 처리가 더 복잡해질 것 같아 냅뒀습니다. ..

    [ClassFlix] EP 18. QueryDSL 도입 (검색기능)

    Querydsl의 꽃 검색기능을 도입합니다. 서비스 계층 설계 조건을 저장하고 전달하는 DTO를 생성합니다. 해당 dto의 인스턴스를 검색,페이징,정렬기능을 하는 리포지토리에 넘겨줍니다. where절에서 동적쿼리를 위한 Eq, Goe 메서드를 구현하고 넘겨받은 condition dto를 이용해 동적쿼리를 만들어 결과를 구합니다. 서비스 계층 구현 페이징과 정렬을 구현할때 동적쿼리는 거의 다 짜놔서 condition dto 생성과 where절 수정만 해주면 서비스 계층 구현은 될 것 같습니다. LectureSearchCondition package dongho.classflix.controller.dto; import lombok.Data; @Data public class LectureSearchCond..

    [ClassFlix] EP 17. QueryDSL 도입 (페이징, 정렬)

    Querydsl 도입 계획 build.gradle 작성, JPAQueryFactory등 Querydsl 도입 기존에 있는 jpql을 querydsl로 바꾸기 홈 화면에서 페이징, 정렬 기능 (대량 강의 데이터 추가, ddl 설정 변경) 강의 검색기능추가 (페이징, 정렬기능) Querydsl 도입 build.gradle, Q-type파일 생성 기존에 작성했던 QueryDSL 설정 포스팅을 참고하여 설정합니다. 2021.06.08 - [Web/QueryDSL] - [QueryDSL] EP1. QueryDSL 설정 [QueryDSL] EP1. QueryDSL 설정 QueryDSL 사용에 앞서 설정을 해주도록 하겠습니다. 기본적으로 QueryDSL은 start.io 에서 dependency를 제공하지 않기 때문..

    [ClassFlix] EP 16. 리팩토링 계획

    Querydsl 도입 build.gradle 작성, JPAQueryFactory등 Querydsl 도입 기존에 있는 jpql을 querydsl로 바꾸기 홈 화면에서 페이징, 정렬 기능 (대량 강의 데이터 추가, ddl 설정 변경) 강의 검색기능추가 (페이징, 정렬기능) N+1문제를 해결해야하는 기능 도입 멤버를 눌렀을때 그동안 달았던 리뷰가 무엇인지 볼 수 있는 기능을 도입해야합니다. 이 기능은 mvc2강의를 통해 실제 로그인과 회원가입 기능을 구현한 뒤 도입해야 하기 때문에 Querydsl도입에서 다루지 않습니다. MVC2 강의 듣고난 뒤 추가할 기능들 회원가입, 로그인 회원정보페이지 강의 리스트 생성 수정 삭제 기능 회원정보에서 내가 단 리뷰와 강의리스트를 볼 수 있게 함 (N+1문제 해결해야함)

    [ClassFlix] EP 15. 리팩토링 (Spring Data JPA 적용)

    목차 (클릭시 해당 목차로 이동) 지금까지는 스프링 데이터 JPA를 적용하지 않고 순수 JPA로 개발했습니다. 기존의 순수한 JPA코드들을 차근차근 스프링 데이터 JPA로 바꿔가 보겠습니다. 계획 각 리포지토리에서 사용중인 기능들을 1. 공통/쿼리 메소드로 해결가능한 기능과 2. 사용자정의 리포지토리로 풀어야 하는 기능을 구분해 스프링 데이터 JPA를 적용합니다. ToOne관계에서 fetch join이 필요한 부분도 풀어냅니다. Auditing을 이용할 것인데 BaseEntity, BaseTimeEntity를 둘 다 만들지만 적용은 BaseEntity만 합니다. 수정,등록자는 인증, 세션을 도입한 후 실제 사용자의 아이디를 받아 넣을 것입니다. MemberRepository 현재 구현된 메서드들 공통메서..

    [ClassFlix] EP 14. 리팩토링과 성능최적화 - 3

    리뷰수정기능개발 ✓ 리뷰삭제기능개발 ✓ 회원가입창에서 footer 크기조정 ✓ 리뷰등록 디자인 (입력부분가로로나열, 등록버튼 모양) ✓ 사진등록기능 ✓ 리팩토링 ✓ 디자인다듬기 느낀점, 발전할점, 추가할점 정리하기 이슈 리팩토링 하기전에 어플리케이션을 한번 복잡하게 돌려보았습니다. 리뷰관련 2가지 이슈가 발생했습니다. 리뷰의 개수가 많아지면 리뷰삭제가 작동하지 않는다. 리뷰의 개수가 많아지면 리뷰수정,삭제시 강의에 별점반영이 안된다. 리뷰삭제 이슈 해결 리뷰삭제 작동문제는 JQuery에서 form 객체를 못읽는 문제가 있어서 Javascript의 getElementById로 폼객체를 가져와 submit하도록 수정했더니 정상동작했습니다. 리뷰 수정, 삭제시 별점반영 안되는 이슈 해결 성능문제를 위해 강의의..