본문 바로가기

분류 전체보기233

실전 프로젝트 피드백 N+1 문제 1. 문제상황 - 기술 매니저님 피드백 개선 사항 중에 N+1문제가 발생하는지 체크해보라고 하셨다. - 후기 개수를 count 해주는 쿼리가 질행되는데 company(업체), theme(테마) 전부를 조회하고있는 부분을 확인했다. 2. 문제 원인 @OneToMany로 themeList를 불러오는 부분의 fetch type이 EAGER(즉시로딩)이어서 발생한 문제인것을 확인했다. 3. 문제 해결 fetch = LAZY(지연로딩) 로 수정 - 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. //JPQL select o From order o; -> SQL select * from order n(100) + 1 (orde.. 2022. 11. 29.
엔티티 설계시 주의점 1. 엔티티에는 가급적 setter를 사용하지 말자 - Setter가 모두 열려있다. 변경포인트가 너무 많아서, 유지보수가 어렵다. 2. 모든 연관관계는 지연로딩으로 설정 - 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. //JPQL select o From order o; -> SQL select * from order n(100) + 1 (order) == N + 1문제 - 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다. - 연관된 엔티티를 함께 DB에서 조회해야하면, fetch join 또는 엔티티 그래프 기능을 사용한다. - OneToOne, ManyToOne 관계는 기본이 즉시로딩이므로 직.. 2022. 11. 29.
Spring security 정리 1. 웹의 인증 및 인가 ● 인증(Authentication) : 사용자 신원을 확인하는 행위 - 회사 출입을 위한 출입증 확인 혹은 생체 정보, 인식 ( 너 누구누구 맞아?) - 아이디/패스워드, 각종 인증서 ● 인가(Authorization) : 사용자 권한을 확인하는 행위 - 주로 역할에 따른 사용 권한 관리 - 특정게시판 조회 권한 - 회사 건물 내 접근 권한 관리 I. 방문자 -> 회의실만 접근 가능 II. 직원 -> 회의실, 사무실 접근 가능 III. 관리자 -> 회의실, 사무실, 서버실, 물품보관실 접근 가능 2. 쿠키와 세션 ● HTTP(HyperText Transfer Protocol) : 웹 상에서 데이터에 대한 요청과 응답을 주고 받는 규칙 ● State(상태) : 클라이언트(사용자).. 2022. 11. 28.
10주차 어느덧 10주차에 접어 들었다. 프로젝트를 하면서 여러 문제가 많이 발생하는것 같다. 그것이 코드가 될 수도 있고 사람이 될 수도 있는 것 같다. 여러사람들이 모여서 프로젝트를 해 나가다 보면 충돌이 일어날 수도 있을것 같다. 프로젝트를 시작하면서 부리더를 맡아서 좋은 분위기에 팀을 이끌어보자고 마음 먹었지만 항상 모든일은 내맘데로 되지 않듯이 이것 또한 쉬운일은 아닌것 같다는 생각이 들었다. 어떻게 하면 좀 더 부드럽게 팀원들을 이끌어 가야할지 고민을 많이 했던 한주였다. 사회에 나가보면 다양한 사람들이 존재 할 것이고 그때마다 목소리를 높이면서 싸울수는 없는 일이다. 어떻게 하면 현명하게 이상황을 대처해 나가야할지를 고민하는것도 큰 공부인것 같다는 생각이 들었다. 팀원의 말투가 불친절할때 왜 저렇게 .. 2022. 11. 28.
OAuth2 카카오 로그인 소셜 로그인 탄생 배경 - 모든 웹 사이트에서 회원가입 과정을 거치는 것은 사용자에게 부담이 된다. - 매번 번거로운 회원가입 과정을 수행해야 할 뿐 아니라, 웹 사이트마다 다른 아이디와 비밀번호를 기억해야 한다. - 또한 웹 사이트를 운영하는 측에서도 회원들의 개인정보를 지켜야하는 역할이 부담이 된다. - 이런 문제를 해결하기 위해 OAuth를 사용한 소셜 로그인이 등장함 OAuth 란? OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로 사용되는, 접근 위임을 위한 개방형 표준이다. 사용자가 애플리케이션에게 모든 권한을 넘기지 않고 사용자 대신 서비스를 이용할 수 있게 해주는 HTTP .. 2022. 11. 28.
offset 오프셋 (컴퓨터 과학) 컴퓨터 과학에서 배열이나 자료 구조 오브젝트 내의 오프셋(offset)은 일반적으로 동일 오브젝트 안에서 오브젝트 처음부터 주어진 요소나 지점까지의 변위차를 나타내는 정수형이다. 이를테면, 문자 A의 배열이 abcdef를 포함한다면 'c' 문자는 A 시작점에서 2의 오프셋을 지닌다고 할 수 있다. 어셈블리어와 같은 저급 프로그래밍 언어에서 오프셋은 상대 주소(relative address)로 부른다. 2022. 11. 28.
queryDsl, jpql 차이점 package com.sparta.querydsl.entity; import com.querydsl.jpa.impl.JPAQueryFactory; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import java.. 2022. 11. 22.
queryDsl 기본 테스트 코드 테스트 코드 package com.sparta.querydsl.entity; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Commit; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.PersistenceCont.. 2022. 11. 22.
9주차 실전프로젝트에 들어와서 7주차 8주차 wil을 작성하지 못하였다. 실적프로젝트를 하면서 시간이 없었기도 했지만 사실상 핑계인것 같다. 꾸준히 블로그에 글을 올리지 못한것이 사실 아쉽다. 실전프로젝트의 부리더를 맡아서 처음에는 기획한 프로젝트가 버겁게 느껴지기도했지만 팀원들과 소통하면서 문제를 해결하고 하나하나씩 API를 구현해 나가니깐 구현해나가는 재미를 느꼈다. 팀원들과 소통하면서문제를 하나하나 해결해 나가면서 내스스로 성장하는것을 느꼈고 코딩하는것에 대한 즐거움을 많이느낀 한주였다. 이번주는 트러블 슈팅 위주로 wil를 작성했다.앞으로 있을 MVP 발표와 최종 발표 까지는 트러블 슈팅이나 리팩토링 관련해서 올릴것 같다. 자기가 맡은 부분을 잘 해결해주는 팀원들과 기능구현에 있어 시간을 재촉하지 않았던.. 2022. 11. 22.
Unsupported Media Type, status 415 @RequestPart로 데이터를 입력할때 json형식으로 보내는 데이터 타입은 CONTENT Type에서 applicationJson으로 바꿔줘야한다. 2022. 11. 14.
java.lang.StackOverflowError: null 스프링으로 실전 프로젝트를 개발하던 중 해당 오류가 나왔다. 해당 오류는 JAVA에 Json 타입 변환 과정 중 일어난 오류이다. 이는 테이블과 테이블이 연관 관계에 있으며 이를 mode.addAttribute 메소드를 통해 데이터를 Front로 보낼때 Json으로 변환 과정중에 무한으로 참조가 순환되어 일어나는 오류로 간단히 해결할 수 있다. 문제 @Entity @Getter @AllArgsConstructor @NoArgsConstructor @Builder public class Theme { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // @Column(name = "theme_id") public Long id; @JsonIgnore @M.. 2022. 11. 12.
@RequestParam, @RequestBody 2022. 11. 5.