일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- raw 타입
- 자바스터디
- auto.create.topics.enable
- 함수형 인터페이스
- Switch Expressions
- 바운디드 타입
- 항해99
- System.out
- 제네릭 와일드 카드
- github api
- 상속
- 자바할래
- junit 5
- System.err
- 합병 정렬
- throwable
- annotation processor
- 정렬
- 람다식
- 프리미티브 타입
- 제네릭 타입
- yield
- 로컬 클래스
- 스파르타코딩클럽
- 익명 클래스
- 브릿지 메소드
- docker
- System.in
- Study Halle
- 접근지시자
- Today
- Total
목록Diary (125)
코딩하는 털보
오늘의 삽질 JPQL로 group by, order by 아래와 같은 쿼리를 JPQL로 날리고 싶었다. select user_id from completed_habit group by user_id order by count(*) desc limit 1; User를 직접 꺼내면 User 엔티티와 조인한다. @Query(value = "select new com.sollertia.habit.domain.completedhabbit.QueryDto(c.user) " + "from CompletedHabit c " + "where c.isSuccess = true " + "group by c.user.id " + "order by count(c) desc ") List test();User를 직접 꺼내지 않고..
오늘의 삽질 Jpa Method Query로 Like 쿼리 사용하기 Habit 엔티티는 practiceDays 라는 요일 문자열을 가지고 있다. private String practiceDays;예를 들어 매일은 "1234567", 화수목은 "234", 월수금은 "135". 오늘을 숫자로 표현하고 메서드 쿼리로 그 숫자와 매칭되는 Habit 엔티티를 조회하려고 한다. JPA 메서드 쿼리에서 Like를 사용하려면 Contains, Containing, IsContaining 문구를 사용하면 된다. List findByUserAndPracticeDaysContains(User user, int day);JPA JPQL 다른 클래스로 결과 받기 @Query(value = "select new com.solle..
오늘의 삽질 org.hibernate.LazyInitializationException User 엔티티는 Habit 엔티티와 다대일 양방향 매핑되어있다. @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List habit; 그런데 아래 비즈니스 로직에서 for문을 돌때 org.hibernate.LazyInitializationException 예외가 발생한다. @Override public List getHabitSummaryList(User user) { List habitSummaryList = new ArrayList(); List habits = user.getHabit(); for (Habit habit : habits) { h..
Spring Data Redis build.gradle implementation 'org.springframework.boot:spring-boot-starter-data-redis' application.properties spring.redis.host = localhost spring.redis.port = 6379 Cacheable Cache의 대상이 되는 정보들 단순한, 또는 단순한 구조의 정보들을 반복적으로 동일하게 제공해야 하거나 정보의 변경주기가 빈번하지 않고, 단위처리 시간이 오래걸리거나 최신화가 반드시 실시간으로 이뤄지지 않아도 서비스 품질에 영향을 거의 주지 않는 정보인 경우 Cache를 사용할때 주의해야 할 것 캐싱할 정보의 선택 -> 제일 중요하겠다. 캐싱할 정보의..
XSS filter에서 사용한 HTMLCharacterEscapes와 이모지 사용하던 HTMLCharacterEscapes에 의해 이모지가 입력되면 데이터를 역직렬화 할 때 아래와 같은 에러가 발생했다. Could not write JSON: Unmatched first part of surrogate pair (0xd83d) getEscapeSequence 메서드에서 분기하여 우회할 수 있다. @Override public SerializableString getEscapeSequence(int ch) { SerializableString serializedString; char charAt = (char) ch; if (Character.isHighSurrogate(charAt) || Characte..
정말 오랜만에 작성하는 TIL... 프로젝트 시작하니깐 너무 바빠서 쓸 생각도 못하겠다. 오늘 삽질한걸 돌아보자. MVC Unit 테스트에서 'JwtTokenProvider'를 찾을 수 없다는 에러가 발생했다. JwtTokenProvider 빈이 등록되어 있는 Configuration 클래스를 테스트에서 사용할 수 있도록 등록해주면 해결되었다. @ContextConfiguration(classes = WebConfig.class) 난 단순히 게시글 API 단위 테스트를 하려고 하는데 얘가 왜 필요할까 생각해봤는데, 아마 라이브러리에 스프링 시큐리티 테스트가 있어서 그런건 아닐까 했는데 그건 아니었다. 어쩌면 @WebMvcTest는 어플리케이션 컨텍스트에 등록된 필터들 까지 동작시키는 걸지도..
테스트 코드 작성의 장단점 장점 예상 동작과 실제 동작을 비교하여 빠르고 정확한 테스트가 가능하기 때문에 초기 개발의 디버깅이 쉬워진다. 어플리케이션이 변경(기능 확장 또는 리팩터링 등)되더라도 올바르게 작동하는 지 확인할 수 있다. 단위 테스트 자체를 어플리케이션에 대한 문서로 사용할 수 있다. 특히 잘 만든 테스트 케이스는 API 기능을 쉽게 파악할 수 있도록 도와준다. 여러 빌드 도구들(maven, gradle 등)은 테스트 자동화 기능을 포함하고있다. 단점 테스트 코드까지 작성해야하기 때문에 개발 시간이 오래 걸리게 된다. 어플리케이션 변경 사항을 테스트 코드에도 적용해야 하기 때문에 테스트 코드를 유지보수하는 비용이 든다. 테스트 종류 별 (단위 테스트, 통합 테스트, E2E 테스트) 특징 단위..
오늘은 과제 마감일이다. 아래 요구사항을 빠르게 적용시켜보자. 게시글 조회 페이지 > 댓글 수정 내가 작성한 댓글만 수정 가능하도록 하기 댓글 본문이 사라지고, 댓글 내용, 저장 버튼 생성하기 댓글 내용에는 이전에 입력했던 댓글 내용을 기본 값으로 채우기 수정할 댓글 내용은 비어 있지 않도록 하기 저장 버튼을 누른 경우 기존 댓글의 내용을 새로 입력한 댓글 내용으로 바꾸기 게시글 조회 페이지 > 댓글 삭제 내가 작성한 댓글만 삭제 가능하도록 하기 "정말로 삭제하시겠습니까?" 메세지를 띄우고, 확인/취소 버튼 중 "확인" 버튼을 누른 경우 목록에서 해당 댓글을 삭제하기 취소를 누른 경우 삭제되지 않고 그대로 유지하기 @ManyToOne Cascade 댓글을 만든 뒤로 게시글 삭제가 안되는 문제가 생겼다. ..
JPA Dirty Checking 영속 엔티티(managed)가 수정되면 JPA가 Dirty Checking 기능으로 엔티티의 변경을 감지하여 DB와 1차 캐시의 일관성을 맞춘다. Dirty Checking : 1차 캐시의 스냅샷(1차 캐시에 캐싱될 때의 엔티티 상태)과 현재 엔티티의 상태를 비교하는 것, 변경이 있으면 update SQL을 생성하여 쓰기 지연 SQL 저장소에 저장한다. Flush 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것. 플러시가 발생하면 어떤일이 일어나는가? Dirty Checking 감지된 Update 쿼리를 쓰기 지연 SQL 저장소에 저장 쓰기 지연 SQL 저장소의 SQL 쿼리들을 DB로 전송 그럼 플러시는 언제 발생하는가? em.flush() 트랜잭션 커밋 JPQ..
오늘 할 일 소셜 로그인 기능 3주차 강의 듣기 테스트 코드 작성 및 리팩터링 Oauth2 기반 카카오 Login 기능 추가하기 Redirect URL : http://localhost:8080/account/oauth/callback 인가 코드 받기 GET /oauth/authorize?client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}&response_type=code HTTP/1.1 Host: kauth.kakao.com Redirect URL HTTP/1.1 302 Found Content-Length: 0 Location: {REDIRECT_URI}?code={AUTHORIZE_CODE}@GetMapping("/oauth/callback") public..