본문 바로가기

전체 글82

[JPA] Spring과 JPA-3 Spring data jpa Query method기존 jpa를 활용하면 등록, 수정, 삭제, 상세조회 외에도 상세한 검색 필터가 필요하다이때 JPQL을 사용하면 되지만 JPQL은 따로 배워야 하고 jpa 보다 불편하다그래서 최대한 JPQL을 직접 사용하지 않고 검색 필터를 사용할 수 있도록 쿼리 메소드라는 기능이 생성되었다쿼리 메소드 : 스프링에서 제공하는 기능으로 메소드 이름을 기반으로 JPQL 쿼리를 생성1. 쿼리 메소드쿼리 메소드의 작명으로 자동으로 JPQL 쿼리를 생성한다검색기능의 가장 대표적인 것은 find 이다find + 엔티티 이름 + By + 변수 이름ex) findEmployeeByName(String searchKeyword) : Employee 객체 중에서 name 변수 값이 sea.. 2024. 7. 31.
[JPA] Spring과 JPA-2 Spring Data JPA1. Spring Data JPA의 등장 이유JPA는 SQL, SQL 처리를 위한 복잡한 JDBC 코드까지 제공한다는 점에서 유용한 기술이다하지만, JPA를 사용하더라도 반복적인 코드 사용이 없어질 수 는 없다예를 들어 리포지터리 클래스들을 작성하다 보면 각 리포지터리 클래스마다 중복 코드가 등장할 수 밖에 없다em.merge()em.persist()em.remove()이러한 메서드들은 실제 EntityManager의 메소드들을 반복적으로 호출한다는 것밖에 없기 때문이다이러한 반복적인 것들을 없애기 위해 spring data jpa 가 등장하였다2. 엔터티 관리 Repository 상속 방법EmployeeRepositorypackage com.rubypaper.biz.repos.. 2024. 7. 30.
[JPA] Spring과 JPA-1 1. Srping1.1 배경EJB(Enterprise Java Bean) 로 개발 시 어렵고, 무거운 것이 단점⇒ 경량 프레임 워크의 필요성이 대두 ⇒ Spring애플리케이션에서 사용되는 여러 가지 빈(클래스 객체)를 개발자가 아닌 스프링 프레임 워크가 권한을 가지고 직접 관리하는 특징이 있음( 약한 결합 )model 2 에서는 controller 가 요청 처리를 위해서 해당 dao 가 필요함⇒ 느슨한 결합을 제공해주는 것이 spring 임( DI 개념을 활용 )⇒ 강한 결합 대신에 느슨한 결합이 되도록 개발을 해야 함1.2 특징EJB 보다 가볍고 배우기 쉽고, 경량 컨테이너의 기능을 수행함제어역행 (IoC, Inversion of Control) 기술을 이용해 애플리케이션 간의 느슨한 결합을 제어빈(B.. 2024. 7. 29.
[JPA] JPQL 연산자와 함수 연산자 함수SQL은 각 데이터베이스에서 제공하는 연산자나 함수가 조금씩 다르다는 것때문에 쿼리 문을 공유할 수 없다그러나 JPQL에서는 특정 데이터베이스에 종속되지 않는 연산자와 함수를 지원하기에 여러 데이터베이스에서 사용이 가능하다또한 JPA에서는 엔터티를 사용해서 데이터를 저장하고 있기에 컬렉션을 사용하여 값이 존재하는지 아닌지 empty, member 연산자로 할 수 있다is empty 연산자실행 코드String jpql = "SELECT d FROM Department d " + "WHERE d.employeeList is empty"; TypedQuery query = em.createQuery(jpql, Department.class); .. 2024. 7. 25.
[JPA] groupping과 subquery JPQL(Groupping, sort, paging 처리, subquery)JPQL로 Group by, HavingSQL과 마찬가지로 JPQL에서도 group by, having 을 사용할 수 있다group byjpql 쿼리 문에 group by 조건을 넣어 준다쿼리문String jpql = "SELECT d.name, MAX(e.salary), MIN(e.salary), "+ " SUM(e.salary), COUNt(e.salary), AVG(e.salary) "+ " FROM EmployeeJoin e JOIN e.dept d " + " GROUP BY d.name ";실행 결과Hibernate: .. 2024. 7. 24.
[JPA] JPQL JPQLJPQL의 사용 목적JPA에서 기본적으로 제공하는 메서드를 이용하여 데이터베이스의 연동을 처리할 수 있었다. find(), getReference() 를 이용하여 값을 가져와 수정, 삭제 등을 할 수 있었지만 이것은 하나의 데이터에 검색을 수행하는 것이다이제는 하나의 데이터가 아니라 여러개의 데이터를 한꺼번에 검색하여 가져올 수 있게 하기 위해 JPQL을 사용한다JPQL은 SQL과 비슷하지만 테이블을 중심으로 검색하는 SQL과는 다르게 엔터티를 기준으로 1차 캐시에서 검색하는 것을 기본으로 하고 있다JPQL 의 기초 사용법JPQL 을 String으로 만들어 준다String jpql = "SELECT e FROM Employee AS e";쿼리를 전송하여 결과값을 저장한다쿼리를 전송하는 create.. 2024. 7. 22.
[JPA] 연관관계 매핑( 다대다) 다대다1. ERD 에서 다대다 관계주문 테이블(S_ORD), 상품테이블(S_PRODUCT)두 테이블을 다대다 관계로 맺어주기 위해 관계설정용 table이 필요함S_ITEM table관계 설정용 table은 정규화를 통해서 중복되는 데이터를 없애기 위해서 만들어진 것관계를 맺어주기 위해, S_ITEM 칼럼은 S_ORD, S_PRODUCT 의 PK를 FK로 사용하고 이 두개의 FK가 복합키로 사용됨2. 다대다 table 관계를 Entity 기준 설계관계 설정 방법Entity 두개로 관계를 설정S_ORD 에 대한 Entity 와 S_PRODUCT 에 대한 Entity 가 필요하고, 두 테이블의 관계 설정 용 Entity는 사용하지 않음식별관계S_ORD 에 대한 Entity 와 S_PRODUCT 에 대한 Ent.. 2024. 7. 18.
[JPA] 연관관계 매핑(4장 다대일, 일대다) ManyToOne개념@ManyToOne(optional = true, fetch = FetchType.EAGER) // N: 1 관계 (N : 사원, 1 : 부서) @JoinColumn(name = "DEPT_ID") private Department dept;manyToOne은 외래키를 가지고 있는 테이블을 기준으로 생각하는 것이다위의 예시를 보면 하나의 테이블이 Department 의 값을 외래키로 가지는 것이다이때 주의해야 할 것은 다른 테이블의 객체를 저장한 테이블만 다른 객체를 참조할 수 있기에 단방향으로 조회가 가능하다기존의 데이터베이스에서 키의 참조는 방향이 없다하지만 JPA에서는 외래키를 설정하는 것이 아니라 참조하려는 데이터의 객체를 저장하는 것이기에 참조하는 데이터를 가지는 기존 테이블.. 2024. 7. 14.
[OOP] 객체지향의 원칙 SOLID - 의존성 역전 원칙 (DIP) 의존성 역전 원칙 (Dependency Inversion Principle, DIP)고수준 모듈은 저수준 모듈에 의존해서는 안 된다 둘 다 추상화에 의존해야 한다추상화는 세부 사항에 의존해서는 안 된다. 세부 사항은 추상화에 의존해야 한다  DIP의 장점유연성 향상: 시스템의 한 부분을 변경해도 다른 부분에 영향을 주지 않으므로 시스템의 유연성이 높아다.테스트 용이성: 각 모듈이 추상화에 의존하기 때문에 단위 테스트가 용이하다.유지보수성 향상: 코드의 변경이 적고 재사용성이 높아져 유지보수성이 향상된다. 다른 원칙과의 관계:SRP: SRP를 지키면 각 클래스가 단일 책임을 가지므로, 의존성 주입 시 명확한 역할을 가진 객체들 간의 관계를 설정할 수 있습니다.OCP: DIP를 지키면 구체적인 구현체 대신 .. 2024. 6. 23.
[OOP] 객체지향의 원칙 SOLID - 인터페이스 분리 원칙 (ISP) 인터페이스 분리 원칙 (Interface Segregation Principle, ISP)특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않도록 해야 한다 (추상화)  인터페이스 분리 원칙은 객체가 자신의 책임이 아닌 행위를 물려 받지 않게 하는 것으로 각 책임별로 인터페이스를 나누어서 생성해야 한다는 것이다만약 그렇지 않고 범용 인터페이스를 생성하면 나중에 코드의 유지보수가 어렵다 다른 원칙과의 관계SRP: SRP를 지키면 인터페이스도 단일 책임을 가지게 되어 ISP를 만족할 수 있습니다.OCP: 인터페이스가 잘 분리되어 있으면 새로운 기능을 추가할 때 특정 인터페이스를 확장하기 쉬워 OCP를 만족할 수 있습니다.LSP: .. 2024. 6. 23.
[OOP] 객체지향의 원칙 SOLID - 리스코프 치환 원칙 (LSP) 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있어야 한다. 자식 클래스는 부모 클래스의 기능을 대체하거나 확장할 수 있어야 한다. (상속 , is-a 관계) 리스코프 치환 원칙은 상속에 관한 원칙으로 객체지향에서의 서브타입과 슈퍼타입에 대한 개념으로 생각할 수 있다. 서브타입은 자식클래스로, 슈퍼 타입은 부모 클래스로 생각하면 서브 타입은 특수화 타입이고 슈퍼 타입은 일반화된 타입이므로 서브 타입인 자식클래스가 슈퍼 타입인 부모 클래스에 순응을 한다고 할 수 있다 이때 순응이란 서브타입이 슈퍼타입의 구조화 행위를 따라하는 것이다하위형식에서선행조건을 더할 수 없음자식 클래스에서 부모 클래스에 있는 기능에 추가적인 조건을 덧붙일 수 없다하위형식에서 후행조건을 약화실킬 수 없음부모 클래스에서 기능의 .. 2024. 6. 23.
[OOP] 객체지향의 원칙 SOLID - 개방 폐쇄 원칙 (OCP) 개방-폐쇄 원칙 (Open/Closed Principle, OCP)소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다. 새로운 기능을 추가할 때 기존 코드를 수정하지 않고도 확장할 수 있어야 한다. 개방 폐쇄 원칙의 정의는 즉 새로운 기능을 추가하거나 기존 성능을 확장 할 때 기존의 안정적인 코드를 변경하지 않고 새로운 코드를 추가해야 한다는 것이다 이러한 개방 폐쇄 원칙은 객체 지향의 네 가지 특성 중 (캡슐화, 다형성, 추상화)과 연관이 있다  캡슐화 :  다른 객체가 객체의 데이터에 대한 접근을 제어하고 데이터의 변경을 최소화 하는 것그렇기에 개방 패쇄 원칙은 공용 인터페이스(public) 을 통해 다를 객체와 협력하고 다른 메서드들과 상태들은 들어.. 2024. 6. 21.