전체 글 139

[알고리즘] JAVA - Bubble 정렬

- 인접한 요소를 정렬기준(오름차순, 내림차순)대로 교환한다. - 안정 정렬이다.(stable sort) => 정렬 후에도 같은 값들 끼리의 순서가 보장된다. - 제자리 정렬(in-place sort) => 데이터에 필요한 공간을 제외하고 추가적인 공간이 필요없음을 의미한다. - 정렬한 데이터의 개수가 적을때는 나쁘지 않은 속도를 보인다. 과정 1. 앞에서부터 현재 원소와 바로 다음의 원소를 비교한다. 2. 현재 원소가 다음 원소보다 크면 원소를 교환한다. 3. 다음 원소로 이동하여 해당 원소와 그 다음원소를 비교한다. JAVA 코드로 보면 만약 {3,5,2}가 주어질 경우 1번 반복 for(int index=0;index < 3 - 1;index++){ boolean swap = false; for(i..

알고리즘 2022.12.15

Spring - 파일 올리기(이미지 저장하기 ) - RestController

Spring 에서 MultipartFile 인터페이스를 지원해준다. 파일저장을 도와주고 Temporary storage 에 잠시 있다 요청처리가 끝나면 지워지게 된다. 메소드 소개(getName, getOriginalrFilename, isEmpty, getSize, getBytes, transforTo) 여기서 가장 중요한 것은 transferTo 메소드이다. 메소드에 설명을 간단히 보면 파일을 저장할 수 있고 대상 파일이 이미 존재하는 경우 기존에 존재하는 걸 삭제한다. 1.프론트 부분 Html 코드에 multiple을 추가해준다. 여기서 RestController에 요청을 보내야 하는데 어떻게 보낼까? Axios를 사용해서 RestController에 요청을 보낸다. 하나씩 살펴보자 async fu..

Spring 2022.10.11

Git-Flow 주요 Branch 기본개념

GitFlow란? git을 사용하는 개발환경에서 Branch간의 문제 없이 배포까지 안정적으로 할 수 있도록 Branch를 관리하는 전략이다. 장애가 났을때도 Branch를 만들어 대응하는 Branch도 있음 주요 Branch 5가지 1. Main 또는 Master 실제 운영하고 있는 코드만 가지는 Branch이다. 2. Dev main Branch를 기반으로 생성한 Branch이다. Release 또는 Hotfix에서 추가 기능 개발이 이루어지고 Main에 바로 Merge를 하면 꼭 Dev에 Merge를 해줘야 한다. 안 그러면 Dev Branch는 추가 기능을 개발한 코드가 아닌 전 코드에 추가기능을 개발하는 것이기에 코드가 꼬일 수 있다. 3.Feature feature를 개발할때, 즉 기능을 개발..

Git 2022.09.29

JPA - N+1

JPA 에서 연관관계 @OneToMany를 사용하다보면 당연하게 만나게 될 수 있는 이슈이다. 하나에 객체(Board - 1) 을 조회하는 쿼리를 날리면 따라서 하위 객체(BoardImage - N)이 계속해서 쿼리가 호출된다. Board 와 BoardImage는 일대다 관계이다. 1. Board Board와 BoardImage는 양방향 관계이다. 그러므로 Board에서 imageSet 필드를 가지고 있음 2. BoardImage 서로 1대다 관계이다. 여기서 만약 Board에 PK를 참조하는 BoardImage 객체를 호출하는 테스트 코드를 실행해보자 지연로딩이기에 @Transactional로 묶어줘야한다. 테스트 성공하면 이렇게 Board를 조회하는 쿼리 하나와 그 Board에 PK를 참조하는(whe..

Spring 2022.09.19

JPA - @EntitiyGraph, @Transactional Database - NoSession 해결

연관관계가 지연(Lazy)로 되어있을 경우에 만약 하위 엔티티에 접근할 경우 @Transcational로 묶여있지 않는 한 DB연결이 끊기며 No session 에러가 나게 될 것이다. 이런 경우 join하여 값을 가지고 올때 @EntityGraph를 사용할 수 있다. 이렇게 있을 경우에 일반적으로 상위 엔티티를 불러와 하위 엔티티에 접근할 경우 코드를 보자 PK가 2인 값을 불러와서 하위 엔티티를 접근할 경우 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:.....could not initialize proxy - no Session 이러한 에러가 나게된다. DB에 연결이 끊어진 상태에..

Spring 2022.09.15

JPA - Querydsl 정의(간단한 검색기능)

이 내용은 자바웹 개발 워크북을 학습후 정리한 내용입니다. 기본적으로 JPA나 JPQL을 이용하면 SQL을 작성하거나 쿼리를 처리하는 소스 부분이 줄어들기 때문에 무척 편리하다. 하지만 애노테이션을 이용해서 지정하기 때문에 고정된 형태라는 단점이 있다. 그리고 복합적인 조건이 걸릴 수 있는데 이런 상황에서 매우 까다롭기 때문에 Querydsl을 사용하는 것이 좋은 경우가 많다. Querydsl 사용을 위한설정 Q 도메인 클래스를 만들기 위한 설정이다. Querydsl은 Entitiy가 아닌 Q 도메인 클래스를 사용한다. 기존에 사용중이던 Repository와 Querydsl 연동하는 3가지 단계 Querydsl을 사용할 인터페이스를 먼저 구현한다. 위에서 지정한 인터페이스 이름 +Impl 형태로 클래스를..

Spring 2022.09.03

JSP/Spring (Mybatis - Mariadb) Paging 구현

이 글은 자바 웹개발워크북(구멍가게 코딩단) 책을 보고 공부한 내용입니다. 1. 먼저 요청을 받을 RequestDTO를 생성한다. 2. 응답을 보낼 ResponseDTO를 생성한다. 3. 컨트롤러에서 RequestDTO를 받아 Service 로직에 넘기는 걸 구현한다. RequestDTO 생성하기 @Builder.Default를 통해 객체를 생성할때 지정해주지 않으면 자동 으로 page는 1 size는 10이 들어가도록 설정함 getSkip은 limit 뒤에 skip에 넣을 값이다. page가 1일 경우 skip값은 0이 들어가기에 아무 값도 넘기지 않고 바로 보여준다. limt 뒤에 첫번째로 오는 숫자는 넘기는 값이다. 만약 데이터가 20개가 있다고 가정하고 select * from todo order..

Spring 2022.08.31

PRG(Post-Redirect-GET) 패턴

MVC 구조에서 흔하게 사용되는 패턴이 PRG 패턴이다. PRG의 흐름은 대충 - 사용자는 Controller에 원하는 작업(저장,수정,삭제)을 POST 방식으로 처리요청을 날린다. -POST 방식을 Controller에서 처리하고 브라우저는 다른 경로로 요청(GET)하라는 응답(Redirect)한다. -GET방식으로 지정한 곳으로 이동한다. Redirect를 사용하면 브라우저의 주소가 아예 변경되기 때문에 사용자의 새로고침과 같은 계속 되는 요청을 미리 방지할 수 있고 특저앟ㄴ 작업이 완전히 끝나고 새로 시작하는 흐름을 만들 수 있다. 게시판에서 대표적으로 사용되는 경우 -게시판에서 글을 쓸 경우 서버에 Post요청을 날리게 된다. 요청을 받은 서버에서는 원하는 작업(데이터 저장)을 수행하고 redir..

Spring 2022.08.22

Springboot(JPA)-Page 구현

1.Controller 컨트롤러에서는 파라미터로 @PageableDefault 애노테이션으로 간단하게 page(보여줄 페이지), size(몇개인지), sort(정렬기준),direction(내림차순,오름차순) 을 받을 수 있다. 이렇게 하지 않고 따로 page와 size를 받아 구현할 수 있지만 그러면 따로 Pageable에 구현체인 PageRequest.of를 사용해서 따로 구현해야한다. 그러기 보다는 파라미터로 바로 받는게 편한 것 같다. 값을 넘겨줄때는 이런 방식으로 줄 수도 있지만 이렇게 쿼리스트링으로 값을 주지 않는것이 일반적이고 이런 경우 @PagealbeDefault에 설정한 값이 자동으로 들어간다. 하지만 page에 값은 파라미터로 넘겨줘야한다 (page를 제외한 값들은 모두 위에 설정한 기..

Spring 2022.08.21