2021-08-08
0808 spring batch - jdbcItemWriter
0808 SimpleJdbcInsert 이용하기
jdbcTemplate을 이용해서 insert하는 방법은 여러가지가 있다.
1. jdbcTemplate의 update메소드를 이용한다. ??파라메터
2. NamedParameterJdbcTemplate을 이용한다. :컬럼명 파라메터
3. SimpleJdbcInsert 을 이용한다
-> 테이블명 만으로!! sql을 짜지않고!!!! 파라메터만 던지면 insert를 해준다!! 매직!!
jdbcTemplate을 생성자파라메터로 받기때문에 넘겨주고 ( 혹은 dataSource를 생성자에 넘겨줘도 됨)
테이블명 지정하고, map에 넣은 파라메터만 넘겨주면 된다!! 매직!!
근데 신경쓰이는 건 - 결국에 저 테이블명 설정할때 jdbcInsert가 새로 생성되는건가?
아니면 @Bean으로 jdbcTemplate 넘겨줬으니까 싱글톤인가??
생성자에서 테이블명이랑 autoGeneratedKeyColumn다 셋팅해주고. 메서드에서는 이용만 하는 방식으로 하는게 좋을 듯함. 메서드 부를때마다 new되면. insert다량으로 할때 곤란할듯..
4 . SimpleJdbcInsert의 장점은 - autoGenerated되는 key값을 리턴받을 수 있다는 점이다.
마이바티스의 insertKey메서드랑 비슷한느낌!!
generatedAutoKey 값이라는 값만 추가해주면 - 해당 키값을 아주 간편하게 리턴받을수있음!! 매직!!
-------------------------------------------------------
메서드마다 simpleJdbcInsert를 생성할수는 없으니까 - 애초에 해당 repository에서 생성자에서 한번 만들어서 싱글톤으로 돌리는 전략
근데 조금 희한(?)한게, jdbctemplate을 생성자에 넘겨주니까 - SimpleJdbcInsert가 null이라고 에러 뜨더라.
그래서 아예 dateSource를 넘겨주니까 - 에러 안나고 잘됨!!
0808 jdbcTemplate이용하기4 - NamedParameterJdbcTemplate
1. 일반적인 jdbcTemplate은 ?지향의 문법
2. NamedParameterJdbcTemplate를 사용하면 좀더 명시적으로 컬럼을 지정해서 사용할 수있다. select혹은 insert등등 다 적용된다.
위에 쓴 것처럼 map하나 만들어서 넣어줘도 되고, 아니면
SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("id", 1); return namedParameterJdbcTemplate.queryForObject( "SELECT FIRST_NAME FROM EMPLOYEE WHERE ID = :id", namedParameters, String.class);
위와 같은 식으로 , SqlParameterSource라는 클래스를 이용할 수도 있다. add Value하면 되니까 좀더 명시적이라고 할 수 있다.
0808 jdbcTemplate 이용하기3 - BeanPropertyRowMapper
rowMapper의 구현체인 BeanPropertyRowMapper를 사용하면, 굳이 mapRow메서드를 구현하지 않아도 아주 간편하게 select쿼리를 사용할 수 있다!!
조건은 컬럼명과 객체 필드명이 동일할 것.
기본적인 맵핑 전략은 setter를 기준으로 이루어지며, camelcase도 자동적으로 변환해서 맵핑해준다.
만약 맵핑이 안될경우 select as ~~ 같은 alias구문을 sql에 넣어보라고 제안하고 있다.
But..이 BeanPropertyRowMapper는 언제까지나 편의성을 위한 구현 클래스이기때문에, 성능향상을 원한다면 직접 rowMapper를 구현하는 것을 권유하고 있다
아아.. 너무 친절한 설명에 눈물이난다. 고마워요 주석!!
0808 jdbcTemplate 사용하기2 - query, queryForObject
query는 다수의 결과 resultset(List)
queryForObject는 한개의 resultSet만을 기대한다.
따라서
여러개를 expect하면 예외를 던진다. (굳이 왜 이렇게 만들었지?!!!)
0808 jdbcTemplate사용하기
1.
rowMapper를 사용해서 컬럼과 객체를 연관지을때, 넣는 컬럼명이 DB의 컬럼명과 동일해야 한다. writer_email로 컬럼이 잡혀있는데 writerEmail로 객체명으로 썼더니 그딴 컬럼없다!! 면서 오류가 났다.
2. 자바의 LocalDateTime 은 mySQL의 TimeStamp와 결부된다.
이때에는 getTimeStamp("~~").toLocalDateTime()메소드를 활용할수있다.
3. rowMapper클래스를 굳이 만들지 않고, 이런식으로 메서드참조를 이용하면 좀더 깔끔한 코드를 작성할 수 있다.
4. 3번에서 작성한 private메소드를 부모 interface의 default메서드로 옮긺으로써, 더욱 깔끔하게할수있다!!
2021-08-07
0807 spring boot websocket 예제 따라하기
아마 크로스오리진 문제인것??
웹관련 지식이 아직 많이 부족한것같다!!
클린코드도 더 공부하고 싶고 웹소켓관련 기술지식도 더 알고싶다!!
-----------------------------------------
ㅎㅎㅎ단순히 어노테이션오류였다.
0328 fdisk, mkfs, mount, fstab
1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다. - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다. - 마지막에 w를 해야 실제로 반영이 된다. 3. mkfs를 하여 어떤 파일시스...
-
1. NX : 키가 존재하지 않는다면 실행 2. XX : 존재한다면 실행 3. exists키워드 4. incr, decr키워드 ->조회수같은거에 유용할듯!! 5. 레디스의 데이터 타입 : string, list (큐 혹은 덱으로 이용가능), ...
-
cat : 파일 내용을 출력해줌 -n:번호 붙여서 출력 ( number) -b:번호 붙여서 출력하되 공백에는 번호 붙이지 않음 tac : 거꾸로 출력해줌 > : 해당 내용을 옆으로 재지향(?) . 만약 이미 존재하는 파일일 경우 덮어쓰기 한다...
-
1. 마이바티스의 insertSelectkey 를 이용해서 FK를 transactional로 insert하는 처리를 할것이다. 일반적인 insert와 달리 insertSelectkey를 쓰면, 직후 getRNo를 했을때 해당 식별자 값이 nul...