본문 바로가기

MySql

[JDBC] JPA(Java Persistence API) 왜 사용할까? 목차개요ORMEntityPersistence Context(영속성 컨텍스트)Repository한계점 개요JDBC를 더 쉽게 사용하기 위한 JDBC Template은 Query의 결과를 객체로 변환해주는 Mapper를 사용할 수 있습니다. 이 Mapper는 DB 의존성 및 중복 쿼리 문제점이 있습니다. 또한 JDBC Template의 다음과 같은 문제점이 있습니다.문제설명해결 방법상속의 문제RDB는 객체의 상속 관계를 표현할 수 없습니다.@OneToMany, @ManyToOne관계 문제RDB는 객체의 참조 관계 방향을 표현할 수 없습니다.@JoinColumn, @MappedBy탐색 문제RDB는 객체처럼 참조를 따라 순차적으로 탐색할 수 없습니다.@FetchType, fetchJoin()밀도 문제RDB는 .. 더보기
[JDBC] JDBC Template 목차개요JDBC Template 개요⭐ JDBC Template을 알아보기 전, 왜 필요하게 되었는지 간단하게 알아보겠습니다. JDBC Template을 사용하기 전에는 개발자들이 직접 JDBC를 통하여, SQL문을 작성하였습니다. JDBC로 직접 SQL문을 작성했을 때, 다음과 같은 문제가 발생하였습니다. 중복되고 반복적인 SQL 코드 비즈니스 로직과 SQL이 혼재되어 코드의 가독성과 유지보수성이 저하됩니다. (관심사의 분리가 잘 안됩니다.)객체 매핑의 불편함과 타입 오류 가능성`ResultSet`을 수동으로 읽어 객체에 매핑해야 합니다.예: `resultSet.getInt("age")` 에서처럼 수동으로 `age`가 null이면 `NullPointerException`이 발생할 수도 있습니다.컴파일.. 더보기
[JDBC] Query 요청을 위한 Statement vs PreparedStatement 목차개요StatementPreparedStatement 개요💡 JDBC DriverManager를 통해 적절한 드라이버를 찾아 데이터베이스와 연결하고, 연결이 완료되면 `Connection` 객체를 반환받습니다.이 `Connection` 객체를 통해 `Statement` 또는 `PreparedStatement`를 생성하여 SQL 쿼리를 실행할 수 있습니다.`Statement`는 정적인 SQL을 문자열로 직접 실행할 때 사용하고,`PreparedStatement`는 파라미터를 바인딩할 수 있어 보안과 성능 면에서 더 우수합니다. Statement정의정적 SQL 문을 실행하고 그 실행 결과를 반환하는데 사용되는 인터페이스입니다. 특징기본적으로 하나의 `Statement` 객체당 단 하나의 `Result.. 더보기
[JDBC] JDBC Driver 한 방 정리 목차JDBCJDBC DriverDriver 동작 방식 JDBC정의JDBC(Java Database Connectivity)는 자바 애플리케이션에서 데이터베이스에 접근할 수 있도록 하는 API입니다. JDBC 드라이버는 이 API를 구현하여, 자바 애플리케이션과 특정 데이터베이스 간의 연결을 가능하게 합니다. 타입Type 1 : JDBC-ODBC Bridge DriverType 2 : Native API, Partly Java DriverType 3 : Net Protocol, Pure Java DriverType 4 : Native Protocol, Pure Java Driver데이터베이스의 네이티브 프로토콜을 사용하여 직접 데이터베이스에 접근합니다.순수 Java로 구현되어 드라이버가 플랫폼에 종속되지.. 더보기
[내일 배움 캠프, SQL 달리기 반] Lv5. 예산이 가장 큰 프로젝트는? 1. 문제    [5-1] 풀이SELECT Name, Department, SalaryFROM employees eWHERE (Department, Salary) in ( SELECT Department, MAX(Salary) Salary FROM employees GROUP BY Department)ORDER BY 2부서에서 가장 높은 월급 :  Group by Department와 집계함수 Max를 사용하였다. (서브쿼리)부서에서 가장 높은 월급을 받는 직원들 : WHERE 절로 서브쿼리의 값에 포함되지 않는 행들은 필터링해준다. (메인쿼리)   [5-1] 헷갈렸던 부분원래는 WHERE 절에 "in 연산자" 대신 "="을 넣었는데, 아래 사진과 .. 더보기
[내일 배움 캠프, 달리기 반] Lv5. 가장 많이 팔린 품목은? 1. 문제    [5-1] 풀이SELECT CustomerName, SUM(Price*Quantity) TotalAmount, count(1) OrderCountFROM( SELECT c.CustomerName, o.Quantity, o.ProductID FROM customers c LEFT JOIN orders o ON c.CustomerID=o.CustomerID) a LEFT JOIN products p ON a.productID=p.ProductIDGROUP BY 1세 개의 테이블에서 데이터를 가져와야 하므로, 2번의 JOIN 연산을 하였다.   [5-1] 헷갈렸던 부분문제 : 위 문제에서 각 테이블은 행의 갯수가 다르다. 그래.. 더보기
[내일 배움 캠프, SQL 달리기 반] Lv4. 가장 높은 월급을 받는 직원은? 1. 문제    [4-1] 풀이SELECT Name, Department, Salary, if(Top_Salary1, 0 ,Name) Top_Earner, if(Top_Salary1, 0 ,Salary) Top_SalaryFROM(SELECT Name, Department, Salary, RANK() OVER(PARTITION BY Department ORDER BY Salary desc) Top_SalaryFROM employeesORDER BY Name) a문제를 푸는 과정에서 Top_Earner와 Top_Salary를 구하려면, Name, Department, Salary 컬럼이랑 같이 구할 수가 없다. 하지만 기대결과에서는.. 더보기
[내일 배움 캠프, SQL 달리기 반] Lv4. 단골 고객님 찾기 1. 문제    2. 풀이[4-1]SELECT CustomerName, count(OrderID) OrderCount, IF(sum(TotalAmount) is null, 0, sum(TotalAmount)) TotalSpentFROM( SELECT c.CustomerName, o.TotalAmount, o.OrderID FROM customers c LEFT JOIN orders o ON c.CustomerID=o.CustomerID) aGROUP BY 1나중에 주문한 적이 없는 고객을 예외처리하기 위해 서브쿼리에서 OrderID를 함께 넘겨주었다. 메인쿼리에서 OrderID를 카운트한다. 만약 OrderID가 null이면, 카운트하지 않는다.   [4-2]select Country, .. 더보기