Spring

Spring/이론

JPA 기본 - 지연 로딩 즉시 로딩

저번에 쓴 블로그글 프록시에 대해 이해하고 오면 지연로딩에 대해 이해하기 수월하다. 2023.06.28 - [Spring/이론] - JPA 기본 - 프록시 객체 JPA 기본 - 프록시 객체 JPA에서 프록시 객체가 중요한 이유는 이후 즉시로딩과 지연로딩의 차이를 공부하는데에 있다. 엔티티 객체를 조회할 때는 두가지 메서드가 있다. EntityManager em; em.find(): 데이터베이스를 통해서 layton0-0.tistory.com 프록시 객체는 그 안에 target으로 하는 엔티티 객체가 처음에 비워져 있다. -> .getName()과 같이 실제 값에 접근할 때에 쿼리를 날리고 엔티티 객체를 채워넣는다. 처음에 member에 대한 select문만 db에 날리고, 이후에 member.getTea..

Spring/이론

JPA 기본 - 프록시 객체

JPA에서 프록시 객체가 중요한 이유는 이후 즉시로딩과 지연로딩의 차이를 공부하는데에 있다. 엔티티 객체를 조회할 때는 두가지 메서드가 있다. EntityManager em; em.find(): 데이터베이스를 통해서 실제 엔티티 객체를 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체를 조회 프록시 객체는 엔티티 객체를 상속받아서 만들어졌다. 실제 클래스와 겉 모양이 같아 구분이 잘 되지 않으나 실제로 구분해서 쓸 필요는 없다. 프록시의 객체는 실제 객체의 참조를 보관한다. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. 프록시 객체의 초기화 과정이다. // 프록시 객체 생성 (target은 빈값) Member member = em.getR..

Spring/프로젝트

JPA @Id에 Long을 쓴 이유

김영한님의 강의를 보면 항상 @Id값에 @GeneratedValue를 해 auto_increment를 할 경우 Long타입을 쓰시는 모습을 볼 수 있었다. int가 아니라 long을 쓰는 이유는 더 많은 값을 카운트할 수 있어 확장성 때문인 것은 알겠다. 하지만 왜 long이 아니라 Long을 사용하시는걸까? 궁금해서 구글링을 해보니 long은 primitive type이라 값이 없을 경우 0으로 초기화되지만 Long은 wrapper type이라 값이 없을 경우 null로 초기화되기 때문이라는 것을 알 수 있었다. 즉, long으로 둘 경우 기본 초기화값에도 어쨌든 0이라는 값이 존재하기 때문에 이 값이 초기화가 되지 않아 0인건지 아니면 업데이트된 값이 0인지 바로 알기 어렵다는 치명적인 단점이 생기는..

Spring/프로젝트

ERD 설계 과정

TripDream 프로젝트를 시작하고 DB구조를 짜는 것이 먼저라고 판단이 들었다. ERD를 설계해보려 한다. 기능 정의서는 다음과 같다. https://www.notion.so/8e62f0fe168245a28c20576c9bbd2894?pvs=4 기능 정의 갔던 나라 체크 ( GPS인증? 도장찍기~) www.notion.so 기능별 요구사항에 맞춰 ERD를 설계해볼 예정이다. 회원가입 먼저 회원정보 테이블이 필요하다. MEMBER 테이블을 생성. 안에 회원가입 시 받고싶은 정보를 필수/선택을 기준으로 NULL, NOTNULL로 정했다. 회원 테이블의 PK값은 유일무이하고 특별한 값으로 하고 싶어 uuid 자동생성으로 정했다. 또한 row의 생성시간, 수정시간은 모든 테이블에서 받을 예정이다. 추후 접속..

Spring/이론

웹 애플리케이션 이해

웹 서버(Web Server)와 웹 애플리케이션 서버(Web Application Server, WAS) 웹 서버 HTTP 기반 동작 정적 리소스(HTML, CSS, JS, 이미지, 영상) 제공 예) NGINX, APACHE 웹 어플리케이션 서버 HTTP 기반 동작 웹 서버 기능 포함(정적 리소스 제공) 프로그램 코드 실행해 애플리케이션 로직 수행 동적 HTML, HTTP API(JSON) 서블릿, JSP, 스프링 MVC 예) 톰캣(Tomcat), Jetty, Undertow 웹 서버와 웹 애플리케이션 서버의 차이 웹 서버는 정적 리소스(파일), WAS는 애플리케이션 로직 웹 서버도 프로그램 실행 기능 포함하기도 함 WAS도 웹 서버의 기능 제공 자바는 서블릿 컨테이너 기능 제공 = WAS WAS는 애플..

Spring/Trouble Shooting

Cannot set error status - response is already committed 오류

진짜 구성을 완벽하게 했다고 생각했는데 갑자기 사라지지 않는 에러가 생겼다. Cannot set error status - response is already committed 이 에러다. 아직도 공부할 것들이 한참 많은 것 같다. 본론부터 말하자면 저 에러는 Entity에서 나오는 문제이다. Spring Data JPA를 사용했을 때 등장한 문제이다. 순환 참조라는 원인인데 예를 들어 Review 엔티티가 있고 Photo 엔티티가 있다고 치자. Review의 PK를 Photo가 FK로 가지고 있는 상태이다. 무엇이 문제인지 알겠는가? Response를 하게 되면 JSON 형태로 매핑하기 위해 모든 엔티티를 불러오는데 이 때 Photo는 Review를 참조하고 Review는 Photo를 참조한다. 그렇게..

Spring/Trouble Shooting

[NoSuchBeanDefinitionException] expected at least 1 bean which qualifies as autowire candidate

역시 실전은 쉽지 않다. 또 초면인 에러문구를 만났다. 직독직해하면 그런 BeanDefinition은 없어. 라는 말이다. Autowired를 연결해 줄 짝꿍을 못 찾은 것이다. 당연히 이유는 무엇일까. 짝꿍한테 이름표를 안줬다. 오랜만에 프로젝트를 만들다보니 이론에서 배운 인터페이스와 구현체의 분리에만 집중하고 있었다. @Repository를 붙여주는 것을 까먹은 것이다... 레포지토리에게 오토와이어할 친구와 연결될 수 있게 이름표를 붙여주면 해결된다.

Spring/Trouble Shooting

[SQL] ; expected "identifier" 오류

Spring Data Jpa로 엔티티를 이용한 테이블을 만드는 과정 중 마주친 오류이다. 다른 엔티티(Review, Place)는 멀쩡한데 왜 User테이블만 말썽인지 이해가 안갔다. 찾아보니 User라는 이름의 예약어가 SQL에 있나보다. @Table(name="user_table") 이렇게 설정해주니 문제가 해결됐다.

레이튼
'Spring' 카테고리의 글 목록 (3 Page)