이 책에서는 객체지향을 실세계에 비유하여 설명한다.객체를 현실 세계의 생명체에 비유하는 것은 상태(캡슐화)와 행위(자율성)를 설명하는 데 효과적이다. 또한 현실 세계의 사람들이 암묵적인 약속과 명시적인 계약을 기반으로 협력하며 목표를 달성해 나가는 과정인 메시지를 주고받으며 공동의 목표를 달성하기 위해 협력하는 객체들의 관계를 설명하는 데 적합하다.그리고 이런 사물을 기반으로 객체를 구현하는 개념은 객체지향 설계의 핵심인 완견연결성을 설명하는 데 적합하기 때문이다.협력하는 사람들"주문한 커피를 손님에게 제공하기 위해" 협력하는 과정에서 손님, 캐시어, 바리스타는 각자의 책임을 다한다. 커피 주문이라는 협력에 참여하는 모든 이들이 커피를 제공하기 위해 역할과 책임을 다한다는 것이다. 즉, 객체지향에서 중..
문제 상황처음에 프로젝트 설정 시에는 DB(MySQL) 연결이 정상적으로 된 것을 확인했지만, 엔티티를 작성한 후 다시 실행했을 때는, DB 연결이 정상적으로 되지 않았다.환경Spring Boot 3.3.4MySQL 8.0.34로그2024-09-20T16:23:06.654+09:00 WARN 83120 --- [ restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadatajava.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(ja..
문제https://www.acmicpc.net/problem/20040풀이문제를 정리해보면 0부터 n-1 까지의 고유한 번호가 부여된 평면상의 점 n개가 주어지며, 이 중 어느 세점도 일직선 위에 놓이지 않는다.매 차례마다 이를 잇는 선분을 그린다. → 이전에 그은 선분을 다시 글을 수 없으며, 이미 그린 선분과 교차는 가능하다.처음으로 사이클(플레이어들이 그린 선분들의 부분집합)이 완성되는 순간 게임이 종료된다.게임의 진행 상황이 주어지면 몇 번째 차례에서 사이클이 완성 되었는지를 판단하고, 혹은 게임이 진행 중인지를 판단하는 프로그램을 작성해야 한다. 연결을 할 때마다 카운트를 하며 사이클이 생기면 종료를 해야하는데, 사이클을 판단하는 방법으로 Union-find 자료구조를 사용하면 된다.Union-..
사용자 정의 Repository 구현Spring Data JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많기 때문에 Spring Data JPA 리포지토리를 사용하여 인터페이스만 정의하고 구현체는 스프링이 자동 생성하도록 한다.만약, 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면(JPA 직접 사용, 스프링 JDBC Template 사용, MyBatis 사용, QueryDSL 사용, DB 커넥션 직접 사용 등) 사용자 정의 인터페이스를 사용한다.사용 방법1. 사용자 정의 Interface 생성public interface MemberRepositoryCustom { // 이름은 자유 List findMemberCustom();}2. 사용자 정의 Interface의..
@EntityGraphFetch Join아래 코드의 상황은 member1이 teamA를 참조하고, member2가 teamB를 참조하고 있으며, Member와 Team의 관계는 @ManyToOne 지연로딩 관계이다. @Testpublic void findMemberLazy() { // given // member1 -> teamA // member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); Member member1 = new Member("member1", 10, teamA..
JPA는 엔티티를 조회한 뒤, commit 시점에 더티체킹을 통해 수정된 값이 있다면, update 쿼리를 날린다. 즉, 엔티티마다 각각 더티체킹을 하여 update를 각각 날린다.(JPA의 수정)하지만, 많은 데이터를 변경해야 하는 경우, 위 방식은 성능이 좋지 않다. 따라서 DB에 한 번의 update 쿼리를 날리는 것이 보다 효과적이다.(벌크성 수정 쿼리)순수 JPA를 사용한 벌크성 수정 쿼리public int bulkAgePlus(int age) { return em.createQuery("update Member m set m.age = m.age + 1 where m.age >= :age") // 이 조건에 만족하는 것들은 모두 +1이 됨 .setParameter("..
JPA 페이징과 정렬Spring Data JPA는 페이징 및 정렬 기능을 지원한다.순수 JPA 페이징과 정렬아래의 조건으로 페이징과 정렬을 사용해 보겠다검색 조건 : 나이가 10살정렬 조건 : 이름으로 내림차순페이징 조건 : 첫 번째 페이지, 페이지당 보여줄 데이터는 3건public List findByPage(int age, int offset, int limit) { return em.createQuery("select m from Member m where m.age = :age order by m.username desc ") .setParameter("age", age) .setFirstResult(offset) // 어디서부터 가져올 것인지 ..
메소드 이름으로 쿼리 생성순수 JPA를 사용하여 메소드를 작성하면 아래와 같으며 이 메소드는 입력된 사용자의 이름과 나이를 기준으로 Member 엔티티를 검색한다. public List findByUsernameAndAgeGreaterThen(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList();}이번에는 Spring Data JPA를 사..
순수 JPA 기반 리포지토리 만들기JPA는 Java 개발자가 관계형 데이터베이스에서 자바 객체를 저장, 수정, 삭제, 조회할 수 있게 도와주는 인터페이스이다.리포지토리는 기본적으로 CRUD(Create, Read, Update, Delete)를 수행할 수 있어야 한다. 우선 공통 인터페이스를 적용하기 전에 순수 JPA기반 리포지토리 기반으로 api를 만들어 보겠다.@Repositorypublic class MemberJpaRepository { @PersistenceContext private EntityManager em; // 저장 public Member save(Member member) { em.persist(member); return member..
문제https://www.acmicpc.net/problem/19238풀이위 문제의 핵심을 나열해 보며 아래와 같다.택시의 현재 위치 기준 가장 가까운 고객을 태워서 목적지에 데려다 준다.만약, 거리가 가까운 고객이 여러 명일 경우 행과 열이 작은 고객을 먼저 태운다.고객을 태우기 전 택시의 위치에서 고객의 위치까지 이동하는 동안 소비된 연료를 총 연료에서 차감한다. 그리고 목적지에 도착하면 손님이 탑승한 위치에서 목적지 까지의 연료를 차감한 후, 고객의 위치부터 목적지까지 이동하면서 소비한 연료의 양의 2배를 채운다.단, 연료가 떨어지면(0이 되면) 즉시 운행을 종료한다.모든 고객을 목적지에 데려갔을 때, 남아있는 연료의 양을 결과로 출력한다.모든 고객을 목적지에 데려가지 못할 경우, -1을 결과로 출..