문제상황 성능 개선에 관심이 생겨서 그동안 안보고 피했던 로그를 보던 중 성능을 저하시키는 쿼리가 나가고 있었다. 바로 로그인을 할 때 알람 엔티티가 조회되는 것이다. 유저와 알람은 1대1 양방향 관계고, 알람이 유저의 pk를 들고 있다. 로그인시 이메일과 비밀번호 확인을 위한 유저 조회 유저조회 쿼리를 날린 후 알람 엔티티 조회한다. 먼저 어느부분에서 알람 조회 쿼리가 날라가는지 알기 위해 어설프지만 로그를 찍어봤다. @Override public TokenResponseDto login(UserLoginRequestDto requestDto) { log.info(">>>>>>>>>1"); User user = getUserPort.getUserByEmail(requestDto.getEmail()); ..
1. 패러다임의 불일치란 ? 객체와 관계형 데이터베이스가 지향하는 목적이 서로 다름으로 인해 둘의 기능과 표현 방법이 다른 것을 말한다. 기능과 표현 방법이 다르다는게 무슨 말일까 ? 2. 객체모델과 관계형 데이터베이스 모델은 지향하는 패러다임이 서로 다르다. 애플리케이션은 발전하면서 그 내부의 복잡성도 점점 커진다. 이 복잡성을 제어할 수 있는 장치가 바로 객체지향 프로그래밍이다. 도메인 모델을 정의할 때도 객체지향적으로 개발하면 객체지향 언어가 가진 장점들을 활용할 수 있다. 문제는 객체지향적으로 정의한 도메인 모델을 저장할 때 발생한다. 단순히 객체를 저장하는 일이라면 문제가 발생하지 않겠지만, 실무에선 단순히 객체만을 저장하는 일은 거의 없을 것이다. 예를 들어, 사용자가 회원가입을 하면 회원이라..
1. 문제점 처음에 페이징은 Page를 반환하여 사용하였고, 검색처리는 List로 구현하였다. 이러고 보니까 페이징은 되는데 검색처리가 안되고, 검색처리가 되니까 페이징이 안되는 현상이 발생하였다. 페이징 O, 검색처리 X일때 터지는 Exception ClassCastException 검색처리 O, 페이징 X일때 터지는 Exception TemplateInputException 결국엔 검색로직을 반환할때 Page Object로 반환하기만 하면 되는 문제였는데, 반환하는 법을 몰라 2시간동안 삽질하였다. 2. 해결 믿고보는 스택오버플로우 글들.. 간단하다. List로 불러온 것을 new PageImpl()로 감싸주기만 하면 된다.
옛날에 에플리케이션을 개발하는 법 애플리케이션을 개발하면 관계형 데이터베이스를 데이터 저장소로 사용하면서 오랫동안 SQL을 다룬다. 몇 년 전에는 개발자들이 JDBC API를 직접 사용해서 SQL문을 작성해가며 개발을 해왔다. 그러다 보니 애플리케이션의 비즈니스 로직보다 SQL문과 JDBC API를 작성하는 데 더 많은 시간을 보내게 된 것이다. 시간이 지나고 아이바티스(마이바티스), Jdbc Template 등을 SQL 매퍼라 불리는데, SQL 매퍼를 통해 JDBC API 사용 코드를 줄일 수 있었다. 하지만 등록, 조회, 수정, 삭제(CRUD)용 SQL은 여전히 반복해서 작성해야 했다. 반복, 반복, 반복! 자바로 개발하는 애플리케이션은 관계형 데이터베이스를 데이터 저장소로 사용한다. 데이터베이스에 ..
이 부분은 영속성 컨텍스트에 관한 글을 보고 오면 더 이해가 가기 쉽다. 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들려면 식별자 값이 반드시 있어야 한다. 식별자를 할당하는 다양한 전략이 있다. 그 중 많이 쓰는 2가지 전략을 알아보겠다. 1. 기본키 직접 할당 전략 기본 키를 직접 할당하려면 @Id로 매핑시키면 된다. @Id @Column(name="id") private String id; 직접 할당하는 방법은 em.persist() 로 엔티티를 저장하기 전에 에플리케이션에서 기본 키를 직접 할당하는 방법이다. Member member = new Member(); member.setAge(18); //직접 할당 em.persist(board); 2. IDENTITY ..
1. 영속성 컨텍스트 란 ? 눈에 보이지 않는 논리적인 개념 EntityManager을 사용하여 DB에 바로 접근하는 것이 아닌, 영속성 컨텍스트에 접근하여 저장, 삭제 등 가능 2. 엔티티의 생명주기 비영속: 객체가 영속성 컨텍스트와 관련이 없는 상태 public void data() { Member member = new Member(); } 영속: 객체가 영속성 컨텍스트에 의해 관리되고 있는 상태. 아래와 같이 EntityManager을 통해 저장시킨 상태 @PersistenceContext //Entity를 영구저장하는 환경을 만듬 private EntityManager em; //EntityManager 선언 public void data() { Member member = new Member(..
- Total
- Today
- Yesterday