전체 글 117

[SpringBoot] Service 와 ServiceImpl로 구분하는 이유 알아보기

지금까지 공부하고 프로젝트를 만들면서 Service 클래스만 구현해 사용했는데 Spring을 공부하면서 Service 인터페이스와 ServiceImpl 클래스 (구현체) 구조로 많이 사용하는 걸 알게되었다. 굳이 나눠서 구현하지 않아도 코드에 오류는 없기 때문에 무작정 남들은 그렇게 쓴다 라는 이유만으로 사용하는 것 보다 확실하게 알아보고 목적에 맞게 작성하는게 좋은 것 같아서 왜 인터페이스-구현체 구조로 코드를 짜는지 알아보고 정리를 해보려고 한다. 인터페이스 사용이 권장되는 이유는 개방 폐쇄의 원칙(OCP)에 기반한 전략 패턴을 사용하기 위함이다. 개방 폐쇄의 원칙이란 확장에는 열려있고 변화에는 닫혀있다는 의미인데 이미 만들어진 서비스를 커스터마이징 해본 사람은 쉽게 이해할 수 있다. 예를 들어 컨트..

Framework 2023.12.15

JDBC, Spring JDBC, MyBatis, JPA 의 DB 접근 방식 알아보기

제일 처음 웹 개발 공부를 할 때 가장 먼저 배웠던 건 JDBC를 사용해 DB와 연결하는 방법이었다. 그 다음 MyBatis, JDBC Template을 사용해 각각 프로젝트를 만들어보며 DB에 접근하는 방법이 어떻게 다른지 공부했고 최근에는 intellij IDE와 JPA를 사용한 Spring Boot 프로젝트를 제작해 보기 전에 DB 접근 기술들을 전체적으로 정리 해보려고 한다. JDBC JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API로 JDBC를 통해서 DBMS의 종류에 상관없이 데이터베이스를 연결하고 작업을 처리할 수 있다. [UserVO.java] public class UserVO { private String userID..

DATABASE 2023.12.13

[JAVA] MyBatis & JPA 특징과 차이점 (SQL Mapper/ORM)

지금까지 학교나 학원에서 공부를 하면서 MyBatis 만 접하고 사용했다. 물론 MyBatis 도 Servlet, DB에 대한 지식이 있어야 하지만 JPA와 비교했을때 더 학습하기 쉽다고 느껴지는 것과 우리나라의 많은 회사에서 MyBatis를 사용하기 때문에 많이 가르치고 배우는 것 같다. 하지만 세계적으로 JPA를 사용하는 비율이 높아지고 있고 우리나라 역시 JPA 관심도가 높아지고 있다는 점을 알고 공부하던 중 MyBatis와 JPA의 특징과 차이점을 확실히 정리하고 넘어가려고 한다. MyBatis와 JPA를 알기 전 먼저 SQL Mapper와 ORM (Object Relational Mapping) 프레임워크에 대한 이해가 필요하다. 데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는..

JAVA/JAVA2 2023.11.12

[JAVA] JDBC : DB 연결하기

자바를 공부하면 DB와 연결하기 위해 제일 기본적으로 배우는 방법이 JDBC 드라이버로 연결하는 방법이다. JDBC는 Java Database Connectivity의 약어로 자바와 데이터베이스를 연결해 SELECT, INSERT, UPDATE, DELETE와 같은 쿼리문을 사용할 수 있도록 해준다. Oracle과 MySQL 모두 사용할 수 있다. DB 로딩 & 연결 public class UserDAO { private Connection conn; private ResultSet rs; public UserDAO() { try { String dbURL = "jdbc:mysql://localhost:3306/projectName?useUnicode=true&characterEncoding=UTF-8"..

JAVA/JAVA2 2023.11.11

[Servlet] response.sendRedirect & RequestDispatcher 알아보기

서블릿에서 특정 URL이나 페이지로 이동하기 위해서 사용하는 방식인 Redirect와 Dispatcher를 알아보자 RequestDispatcher String viewPage = "view.jsp" RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage); dispatcher.forward(request, response); 위 코드와 같이 forword()로 클라이언트가 요청하면서 전송한 데이터를 그대로 유지한다. 포워딩이 되더라도 주소가 변경되지 않는다. (같은 request 영역 공유) response.sendRedirect String viewPage = "view.jsp"; response.sendRedirect(view); ..

Servlet 2023.11.07

[AWS/RDS] Too many connections 발생 시 Max_connections값 변경하기

같은 코드로 문제 없이 잘 돌아가던 프로젝트가 어느날 NullPointerException이 뜨길래 콘솔창을 확인해보니 Too many connections라는 문구가 떴다. 이리저리 서치하던 중 AWS RDS 파라미터그룹의 max_connections 기본값보다 특정이벤트 또는 사용자의 수가 증가하면 Too many connections 오류가 뜰 수 있다는걸 발견했다. 이 문제를 해결하기 위해 RDS 파라미터그룹 중 max_connections 파라미터 값을 수정해야 한다. RDS Max_connections ? Max_connection 파라미터는 허용되는 동시 클라이언트 연결 수 를 의미한다. 그래서 DB 인스턴스에 대해 허용되는 최대 연결 수는 DB 인스턴스 -> 인스턴스 수준 파라미터 그룹 -..

Errors 2023.08.03

[java] NoSuchMethodError

java.lang.NoSuchMethodError 는 해당 메서드를 찾지 못할때 발생하는 에러다. 나의 경우 이클립스에서는 아무 이상 없이 프로젝트가 실행되었는데 배포 서버에 올리면 NoSuchMethodError가 떴다. 하지만 클래스에 분명히 존재하는 메서드를 사용했고 스펠링 오류나 매개변수를 잘못 입력했는지 확인했지만 모두 이상이 없었다. 다른 블로그를 찾아보면 내부 참조 라이브러리가 빠진 경우나 중복되는 클래스가 있을 때도 발생한다고 하는데 나의 경우 이클립스에서는 아무 이상이 없었기 때문에 그 이유는 아닌 것 같았다. 그 때 문득 WAS(Tomcat)를 중지했다가 다시 시작했을 때 정상적으로 실행됐던 기억이 나서 중지 후 재시작 해보니 배포 서버에서도 메서드가 정상적으로 실행됐다. putty를 ..

Errors 2023.07.27

[MySQL] WITH문 알아보기

쿼리를 작성하다보면 서브쿼리를 사용하는 경우가 많다. 두개 이상 사용하게 되면 가독성이 떨어지고 재사용할 수가 없어서 매번 같은 쿼리를 작성해야한다. 이 때 WITH문을 사용한다. WITH 문 ? 이름을 가진 서브쿼리를 정의한 후 사용하는 구문이다. 쿼리의 전체적인 가독성을 높이고 재사용할 수 있다는 장점이 있다. 대부분의 DBMS에서 지원한다. 계층형 쿼리를 구현할 수 있다. 오라클은 11g 버전부터 계층형 쿼리를 위한 CONNECT BY 절을 지원하는데 오라클에서는 한 번만 사용되면 Inline View, 두 번 이상 사용되면 Masterialize View로 처리한다. 모든 DML에서 사용할 수 있다. 기본 구조 WITH [ 별명1 ] [ (컬럼명1 [,컬럼명2]) ] AS ( SUB QUERY )..

DATABASE 2023.07.20

[MySQL] GROUP BY 와 HAVING 알아보기

GROUP BY GROUP BY문은 동일한 값을 가진 컬럼을 기준으로 그룹별 연산을 적용한다. 그룹화를 하기 위해 집계함수 (COUNT, MAX, MIN, SUM, AVG)와 함께 자주 사용된다. 예시 테이블 BOOK BOOK_NAME CATEGORY PRICE 세이노의 가르침 소설 7000 꿀벌의 예언1 소설 14000 돈의속성 재테크 16000 구의 증명 소설 10800 바다가 들리는 편의점 소설 14000 너무나 많은 여름이 소설 14000 미식가의 수첩 요리 17000 집으로 초대 요리 27000 마음의 자유 에세이 15000 예를들어 위와 같이 BOOK 테이블이 있다고 가정하고 카테고리의 종류와 갯수를 구하고자 한다. 그럼 다음과 같이 SQL문을 작성할 수 있다. SELECT CATEGORY ,..

DATABASE 2023.07.19

[MySQL] 트랜잭션 (Transaction) 알아보기

트랜잭션 (Transaction) 이란 거래라는 사전적 의미가 있고 컴퓨터 과학 분야에선 더이상 분할이 불가능한 업무처리의 논리적인 작업 단위를 의미한다. 데이터베이스 응용 프로그램은 트랜잭션들의 집합으로 정의 가능하며 여러 단계의 처리를 하나의 처리처럼 다루는 기능이다. 여러 개의 명령어 집합이 정상적으로 처리되면 종료되며 하나의 명령어라도 잘못되면 전체 취소된다. 트랜잭션을 쓰는 이유는 일관성을 유지하면서 안정적으로 데이터를 복구하기 위해 사용한다. MySQL에서 트랜잭션은 데이터베이스 상태를 바꾸는 일종의 작업 단위로 사실 우리가 MySQL에 입력하는 모든 쿼리 명령어들은 각각 하나의 트랜잭션이라고 할 수 있다. INSERT, DELETE, UPDATE 등의 SQL명령문을 통해 데이터 상태를 바꿀 ..

DATABASE 2023.07.10