전체 글
-
자바 코드로 정렬 vs db에서 특정 값을 정렬해서 select프로젝트/Trend-Pick 2023. 7. 28. 22:30
사진 랭킹을 보여주는 페이지를 만들 때 dto로 사진 과 사진의 좋아요 개수를 넘겨줘야한다. 처음에는 사진만 select 한 다음 service 계층에서 자바 코드로 로직을 구현했었다. 하지만 좋아요 개수가 아니라 시간에 따른 좋아요 개수로 정렬해야하기 때문에 정렬을 할 때 db와의 소통이 무조건 필요했다. 많은 시간을 들인 끝에야 쿼리로 데이터를 받아오는 것이 맞다고 판단해서 repository 계층에서 select를 할 때 사진과 함께 사진의 좋아요 수를 쿼리로 받아왔다. 주간 랭킹의 예시 public List weeklyLike() { LocalDateTime now = LocalDateTime.now(); LocalDateTime startOfWeek = now.with(DayOfWeek.MOND..
-
메서드에 예외 선언 (throws로 예외 던지기)JAVA/예외처리 2023. 7. 28. 14:21
void method() throws ExceptionA, ExceptionB, ... ExceptionZ { } 위와 같이 메서드에 throws로 예외를 던질 수 있다. (예외를 발생시키는 키워드 throw와 예외를 메서드에 선언하는 throws는 다르다.) 이렇게 예외를 선언하면, 이 예외뿐만 아니라 자손타입의 예외까지 함께 발생시킬 수 있으니 오버라이딩할 때에는 선언된 예외의 개수 뿐 아니라 상속관계를 잘 고려해야만 한다. 자바에서 메서드를 작성할 때 메서드 내에서 발생할 가능성이 있는 예외를 메서드의 선언부에 명시하여 이 메서드를 사용하는 쪽에서 이에 대한 처리를 하도록 강요하기 때문에, 프로그래머들의 짐을 덜어주는 것은 물론이고 견고한 프로그램 코드를 작성할 수 있도록 도움을 준다. public..
-
예외처리 (try - catch문)와 예외 발생시키기JAVA/예외처리 2023. 7. 28. 13:38
에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 에러는 발생하면 복구하기 힘든 심각한 오류이고, 예외는 발생하더라도 수습될 수 있는 비교적 덜 심각한 상황이다. 자바의 예외 클래스의 계층구조는 다음과 같다. 예외를 크게 분류하면 Exception 클래스와 그의 자손들 / RuntimeException 클래스와 그의 자손들로 분류할 수 있다. 모든 예외의 최고 조상은 Exception 클래스이다. 예외 처리 방법 (try-catch) public class Main { public static void main(String[] args) { int num = 10; int result = 0; for (int i = 20; i ..
-
비어있을 수도 있는 객체의 조회 -> Optional 사용프로젝트/Trend-Pick 2023. 7. 27. 16:56
@GetMapping("/post/{postId}") // 게시글 하나 클릭해서 들어가는 것 public PostWithCommentDto createPost (@PathVariable ("postId") Long postId) { Post post = postService.findOne(postId); PostImg postImg = postImgService.findByPostId(postId); List commentList = commentService.post_comment(postId); List commentDtoContents = commentList.stream() .map(c -> new CommentDtoContent(c.getContent(), c.getComment_member()..
-
@RequestParam과 @RequestBody의 차이점프로젝트/Trend-Pick 2023. 7. 22. 17:42
@PostMapping("/create_post") // 글쓰기 페이지에서 저장을 누르는거 public CreatePostResponse savePost(@RequestParam CreatePostDto createPostDto) throws Exception { Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER); Post post = new Post(member, createPostDto.getTitle, createPostDto.getContent, LocalDateTime.now()); Long postId = postService.savePost(post); if (imgInPost != null) { postImgS..
-
조건식 (CASE)JPA/JPQL 2023. 7. 14. 00:35
기본 CASE 식 "select " + "case when m.age = 60 then '경로요금' " + " else '일반요금' " + "end " + "from Member m"; 단순 CASE 식 "select " + "case t.name " + "when '팀A' then '인센티브110%' " + "when '팀B' then '인센티브120%' " + "else '인센티브105%' " + "end " + "from Team t"; CASE 식을 만들어서 특정 조건일 때를 호출 할 수 있다. COALESCE: 하나씩 조회해서 null이 아니면 반환 NULLIF: 두 값이 같으면 null 반환, 다르면 첫번째 값 반환 사용자 이름이 없으면 이름 없는 회원을 반환 select coalesce(m...
-
서브 쿼리JPA/JPQL 2023. 7. 14. 00:21
서브 쿼리의 예제들 - 나이가 평균보다 많은 회원 select m from Member m where m.age > (select avg(m2.age) from Member m2) (상위에서 정의한 Member m을 가져오지 않고 m2를 새로 만들어야지 서브 쿼리 성능이 잘 나옴) - 한 건이라도 주문한 고객 select m from Member m where (select count(o) from Order o where m = o.member) > 0 (서브 쿼리를 할 때 위에서 사용한 m을 아래 서브 쿼리로 끌고오면 성능이 잘 안 나옴) 서브 쿼리 지원 함수 [NOT] EXISTS (subquery): 서브쿼리에 결과가 존재하면 참 {ALL | ANY | SOME} (subquery) ALL 모두 ..
-
페이징, 조인JPA/JPQL 2023. 7. 14. 00:05
페이징 List result = em.createQuery("select m from Member m order by m.age desc", Member.class). .setFirstResult(1) // 시작 .setMaxResults(10) // 몇 개 가져올지 .getResultList(); 페이징 쿼리가 네이티브 sql보다 훨씬 간편하게 나온다. MySQL로 따진다면 SELECT M.ID AS ID M.AGE AS AGE, M.TEAM_ID AS TEAM_ID, M.NAME AS NAME FROM MEMBER M ORDER BY M.NAME DESC LIMIT ?, ? 위와 같은 쿼리가 나가는 것이다. 조인 • 내부 조인: - SELECT m FROM Member m [INNER] JOIN m...