전체 글 170

[오류 해결] Jdbc template의 RowMapper<T> 클래스 구현시 맵핑 객체 생성자 주의해서 보기.2022-02-23

우선 스프링으로 JDBC template를 이용해서, CRUD 서비스를 만드는 중, 분명 SQL 문으로 "Select * from member where Email = ?" 이렇게 잘 작성해서 DB에서 데이터를 뽑아왔다. 그런데, 이상하게 member 객체의 password와 name 멤버가 뒤바뀌어서 나오는 것이다. SQL 구문잘못도 아니고, Member클래스의 생성자를 뒤바꾸게 정의한것도 아니였다. 그런데 예기치 못한 부분에서 해결을 하였다. 바로 RowMapper 클래스의 존재였다. 우리는 일반 JDBC API가 아닌, 스프링으로 JDBC Template을 쓰는 중이다. 그래서 "조회" 를 할때는 ResultSet을 이용하는 것이 아닌, JdbcTemplate.query() 메서드를 이용한다. 이 ..

스프링으로JDBC Template을 이용한 DB연동 (JDBC API vs JDBC Template).2022-02-08

●들어가기전. 스프링으로 JDBC Template을 공부하면서, 일반 JDBC API를 썼을때와 어떤 차이점이 존재하는지, 유념하면서 공부해야지만이 JDBC Template을 완벽히 이해할 수 있다. 그러므로 내가 JDBC API를 공부할떄의 포스팅을 한번 복습하고 넘어와야 된다. 또, 진도를 나가며 계속 이 두 기술의 차이를 생각하면서 공부하면, 쉽게 머리에 들어온다. 나도 계속 비교하면서 공부할것이다. 스프링을 이용할려면, 아래의 자바 개념들을 숙지해야 한다. 람다식이란 한줄로 설명하자면, 람다식 그 자체로 익명 객체이고, 메서드이름과 반환값을 생략하여 메서드를 간단히 나나탠 것이다. 스트림은 DB에 접속해 데이터를 가공하는 SELECT 문과 비슷하게, 데이터의 가공처리를 초기단계-중간단계-마지막 단..

[토이 프로젝트]콘솔기반 유저 게시판 CRUD 서비스. (2022-02-16)

DBMS : ORACLE DBMS(로컬 서버) 언어 : JAVA , JDBC 기반. 구현기능: 사용자가 윈도우 콘솔을 이용하여 게시판의 글을 직접 입력할수 있고, 입력된 게시글은 실시간으로 로컬 데이트베이스와 연동되어 ORACLE 서버에 직접 저장된다. 또한 실시간으로 확인 가능하다. 또한 글 쓴 시간은 DB에서 트리거 쿼리를 활용하여 자동으로 입력된다. 총 페이지수와 게시글 수를 확인 할 수 있고, 페이징 기법을 이용, 사용자가 콘솔에서 이전/다음 페이지 를 선택하여 넘길 수 있다. UI : 1페이지당 나오는 테이블의 개수는 페이징 기법으로 언제나 변경 가능하다(현재는 5개씩 나오게 되어있음.) 글쓰기 기능: 이렇게 TITLE, CONTENT, WRITER_ID를 차례로 입력하면, 서버로 쿼리를 날려서..

개발 프로젝트 2022.02.16

CRUD 서비스 만들기, SQL 페이징 쿼리의 이용(ROWNUM).2022-02-14

우선적으로 사용자에게 DB의 테이블들을 보여주기 위해서는 전부 다 보여주는 것이 아니라, 특정한 갯수대로 끊어서 보여주어야 한다. ROWNUM에 대한 자세한 설명은 내가 SQL공부할떄 작성했던 포스팅을 참고: ROWNUM을 이용한 페이징 출력, 중복제거 distinct 키워드, 문자열 자르기 SUBSTR 함수. 2021-07-29 — "꾸준하게, 지속하자" (tistory.com) select * from (select RowNUM as num, N.* from (select * from notice ORDER BY REGDATE DESC) as N ) where num between 1 and 10; 이렇게 2개의 서브쿼리를 사용하면 페이징을 구현 할 수 있다. 이유는 문법에 있다. SQL의 selec..

Programming/JDBC 2022.02.14

JDBC에서 insert 쿼리 날리기, SQL 쿼리문법 불일치 오류해결(';' 세미콜론 지우기). 2022-02-09.

오늘은 JDBC에서 DB에서 데이터를 "조회" 하는 것이 아닌 "추가" 하는 과정을 해 보았다. 즉, SQL의 DML에는 SELECT, INSERT, UPDATE, DELETE 등이 있는데, 이번에는 insert문을 직접 JAVA에서 JDBC를 이용해 DB로 쿼리를 날리는 작업을 해 보았다. 차이점이 있는데, SELECT 만 쓸 때는, 결과집합(RESULTSET)객체를 만들어주고, 거기서 출력을 해야했었는데, 애초에 조회가 아니라 추가다보니 그럴 일이 없어졌다.(아래의 주석 처리한 부분.) 또 PreparedStatement를 통해 복잡한 인자들을 직접 추가하지말고, 이미 만들어진 SQL에 인덱스별로 추가해주면 된다. 우선 아래의 내가 쓴 코드를 보자. 전혀 문제될 것이 없어보인다. public clas..

Programming/JDBC 2022.02.09

JDBC와 DB간의 커밋(commit). 관계, 열 시퀀스. 2022-02-08

그전에는 커밋을 단지 SQL DEVELOPER의 접속 세션에만 영향을 주는줄 알았는데, 실제 JDBC로 DB에 불러올때도 똑같은 원리가 적용되는줄 이제 알았다. 이전 나의 포스팅을 참고바람. 커밋과 롤백, DATE 형 칼럼에 값 insert 하기. 2021-07-23 — "꾸준하게, 지속하자" (tistory.com) session2에서 notice 테이블에 새로운 테이블을 추가 했음에도, session1에 반영이 안된 모습. (해당 테이블이 ROCK걸린 상태). session2에서 커밋을 완료하고, session1에서 바로 반영된 모습. 그런데 위에 보면 hit가 10 이상인 레코드만 뽑아내는 기능은 session1 ,2 둘다 같은데 코드의 방식이 서로 다르다. session1 은 java 로 if(1..

Programming/JDBC 2022.02.08

ORACLE에 저장된 DB테이블을 JDBC를 이용해 이클립스에서 결과집합 출력하기.(resultset 이용) 2022-02-07

우선적으로 JDBC의 기본적인 쿼리는 연결/인증 - 문장실행 - 결과집합. 등으로 구성된다. 그 이유는 JDBC는 필요한 이유가 기본적으로 여러가지의 DB에 연결 호환성을 주기 위한 템플릿이기 떄문이다. 연결/인증 -문장실행 -결과집합은, 어느 DB에 연결하더라도 해당 DB를 사용하기 위해서 필수적으로 사용해야하는 과정이기에 JDBC는 각 DB에 맞춤형 함수들을 개발해서 JDBC 드라이버에 만들어놓았고, 우리는 그 JDBC DRIVER을 JDBC를 통해 이용하기만 하면 된다. Class.forname("oracle.jdbc.driver.OracleDriver"); //각 DB에 맞는 Driver를 호출해 준다. *특이사항 클래스를 생성할때, new연산자 안씀. Connection con= JdbcDriv..

Programming/JAVA 2022.02.07

이클립스,인텔리제이 같은 IDE 들은 는 단지 프로젝트를 편집하는 기능의 툴 일 뿐이다. 인텔리제이, 이클립스의 기본저장경로. 2021-12-21

이전에도 포스팅 한번 했지만, 이클립스에서 만든 프로젝트는 저장소가 이클립스 내부 저장소가 아닌 프로젝트를 처음 생성할때, 내가 지정해준 내 PC속 공간이다. 이곳에 내가 지정한 장소고 이 장소에 "프로젝트 파일" 만 저장된다. 만약 다른 IDE에서 이 프로젝트를 편집하고 싶다면, 위 경로의 "프로젝트 파일" 을 그대로 불러오면 된다. 프로젝트 파일들은 IDE에 종속되어있지 않다. 언제 어디서든 다른 IDE에 의해 편집될수 있는 독립적인 파일이다. 처음만들때 위치만 지정받을 뿐이다. 만약 내가 다른 IDE에서 작업한 프로젝트를 이클립스에서 다시 작업하고 싶다면 아래 Open Project 탭을 통해 프로젝트가 있는 폴더를 직접 선택해서 이클립스 IDE에서 직접 작업을 이어서 수행할 수 있다. 참고로 이클..

Programming/IDE 2021.12.21

AOP 프로그래밍, 프록시에 대하여. 2021-12-16

우선적으로 AOP 란 Aspect Oriented Programing 의 약자이다. Aspect 란 측면이라는 뜻으로, 좁은 부분을 뜻한다. 즉, 측면 지향 프로그래밍 이란 것은, 프로그램상의 어느 한정적인 부분들을 나누어서 프로그래밍하는 것을 의미한다. 이 한정적인 부분을 공통부분이라 칭하고 핵심부분과 구분되어 별도시스템이 동작 가능하게 한다. 아래의 코드를 보자. public class RecCalculator implements Calculator{ @Override public long factorial(long num) { // TODO Auto-generated method stub if(num==1) { return 1; } return num*factorial(num-1); } } 위 코드..