2021-08-08

0808 spring batch - jdbcItemWriter

https://docs.spring.io/spring-framework/docs/3.0.0.M4/reference/html/ch12s04.html
<< 스프링 배치에서 제공하는 JdbcItemWriter의 경우, 내부적으로 이미 batchUpdate()메서드를 구현해주어서 개발자가 직접 batchUpdate() 쿼리를 짜지 않아도 배치업뎃을 해준다!! 고마워요 스프링!!

일반적인 repository로 jdbctemplate구현해서 사용할 경우에는 update혹은 insert할때 이 쿼리를 개발자가 직접 구현해주어야 함!!
스프링배치 최고!

 

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를 하여 어떤 파일시스...