Spring Argument resolver
platanus |

RequestMappingHandlerAdapter 어노테이션 기반의 컨트롤러, @RequestMapping을 처리하는 HandlerAdapter. RequestMappingHandlerAdapter 동작 방식 ArgumentResolver 어노테이션 기반의 컨트롤러는 다양한 파라미터를 사용할 수 있다. (HttpServletRequest, Model, @RequestParam, @ModelAttribute, @RequestBody) 이것을 처리할 수 있는 것은 ArgumentResolver기반에서 작동하기 때문이다. 원하는 ArgumentResolver를 만들수도 있다. ReturnValueHandler 컨트롤러의 반환 값을 변환 (ModelAndView, ResponseBody, HttpEntity..) HTTP MessageConverter 각 ArgumentResolver들이 HTTP MessageConverter를 사용해 필요한 객체를 생성한다. 각... » read more

Spring Boot 와 Pageable 객체
platanus |

게시판에 필요한 페이징 기능을 어떻게 할까. 찾아보니 대부분은 Pageable 전체를 자체 구현하거나 일부 기능만 자체 구현해 사용한다. 여기서는 Pageable객체를 사용해 Repository부터 Thymeleaf까지 직접 내려보겠다. ArticleRepository SQL ArticleService 서비스부분은 DTO로 컨버팅하는 과정에서 개선의 여지가 있음. Controller 이 부분은 크게 손볼 것이 없는게 Page객체에 내려보내면 thymeleaf에서 쉽게 꺼내쓸 수 있음 Thymeleaf Pagable 하면서 찾아본 것들 https://javabydeveloper.com/spring-jdbctemplate-pagination-examples/ https://github.com/javabydeveloper/spring-boot/tree/master/spring-boot-jdbc-example/src/main/java/com/javabydeveloper https://gist.github.com/mobynote/595b61d72a1a0363dc80b7eb785faef9 https://codereview.stackexchange.com/questions/163131/jdbc-query-with-limit-and-offset... » read more

JdbcTemplate의 SimpleJdbcInsert Bean 등록에 관하여
platanus |

SimpleJdbcInsert 빈 등록에 대하여 Reference 일단 오류와 상관없이.. SimpleJdbcInsert를 빈으로 만드는건 뭔가 이상한듯 저게 저 Repository에서만 쓸텐데.. 저걸 빈으로 만들어서 얻는 이점이 없음 JDBC 드라이버에서 제공해주는 DB 메타데이터를 사용해서 insert 쿼리 정보로 사용한다던데 왠지 빈으로 등록 시점에 JDBC 연결이 완료되지 않았을수도 있겠다 여튼, Entity 객체에서 리플렉션으로 '타입'정보를 꺼내쓴다면 애초에 dataSource같은게 필요없겠지 (순수 Java 리플렉션만으로 될테니)... » read more

세션을 사용하기 위한 Filter와 Interceptor
platanus |

HttpSession 세션 생성을 자동으로 해주는 객체 기본 사용법 Tracking session 쿠키를 지원하는지 안하는지 서버는 모른다. 그래서 주소에 JSESSIONID를 세션 생성할때 내려 보내는데 이것을 모든 컨트롤러에서 다 파싱을 해야하니 불편하다. 대게는 쿠키지원을 하니까 tracking-modes를 cookie로 변경하면 주소에 JSESSIONID가 사라진다. Session timeout Filter, Interceptor Filter : 서블릿 Interceptor : 스프링 Filter 만약 로그인 여부 체크를 컨트롤러마다 해야... » read more

JDBC의 Prepared Statement
platanus |

NamedParameterJdbcTemplate NamedParameterJdbcTemplate query() 가장 정확한 사용법 Prepared Statement 일반 JdbcTemplate은 SQL을 실행할때 Prepared Statement 라는게 있는데,쌩 SQL을 사용하는게 아니라 SELECT * FROM user WHERE id = ? 이런식으로 일정 형식문자열로 SQL을 준비하는 것이다.저걸 Prepared Statement 라고 부른다.그러면, 저 쿼리를 DB가 받으면 무슨일을 하냐면. SQL을 파싱하여 대기 상태로 놓는다.→ 만약 기존에 동일한 SQL쿼리가 있었다면 그 쿼리캐시를... » read more

Java; Optional
platanus |

기본적인 사용법 Optional 객체 만들기 Optional 개체 를 만드는 방법에는 여러 가지가 있습니다. 빈 Optional 객체 를 생성하려면 empty() 정적 메서드 를 사용하기만 하면 됩니다 . 값의 비교 isPresent(), isEmpty() isPresent() 메서드를 사용 하여 Optional 객체 내부에 값이 있는지 확인했습니다 . 값은 null 이 아닌 값으로 Optional 을 만든 경우에만 존재 합니다. 다음 섹션에서 isPresent()... » read more

git flow의 실제 사용
platanus |

git을 잘 쓰기 위한 브랜치 사용법 main이나 develop등 공용 브랜치에 커밋을 하지 않는다 → feature 브랜치로 따로 따서 작업한다. git checkout -b "feature/NUM" 공용 브랜치를 자주자주 pull 받아 브랜치를 최신으로 유지한다 (예를들어 develop) 공용 브랜치는 upstream으로 지정한다 git remote add upstream [URL] git pull upstream [공용브랜치] git push origin [공용브랜치] git의 커밋 흐름은 파일 단위가... » read more

GitHub Actions 으로 간단한 CD 구성하기
platanus |

GitHub Actions CI/CD 기본적으로 github action에서 호스트로 push하는 방식이다. GitHub Actions workflow ${{ secrets.HOST }}를 비롯한 나머지 4개의 환경변수는 Setting - secrets 에서 등록한다. 주요내용은 main 브랜치에서 push가 일어나면 github의 ubuntu 인스턴스에서 ssh를 통해 원격지의 deploy.sh를 실행시킨다는 내용이다. deploy.sh 내용 (20210920 업데이트) 이 스크립트가 하는 내용은 다음과 같다 저장소에서 코드 가져오기 Maven 빌드하기 (package로 jar파일... » read more

MyBatis와 Spring Boot (Annotation)
platanus |

MariaDB Docker 설치 DBeaver 설치 DB 생성 boot 프로젝트 생성 mariadb driver setup application.properties insert하는 컨트롤러 작성 POST 테스트 Select기능 만들기 Mapper Controller GET 테스트 Insert 개선 보통 insert작업을 하면 0이나 1로 리턴값을 받기 보다는 전체의 값을 반환 받는다. 그러나 id의 경우 DB에서 auto increment기 때문에 별도의 작업이 필요하다. 객체를 그대로 반환하면 입력값 그대로 반환되지만... » read more

OS; Virtual Memory
platanus |

가상 메모리 가상 메모리라는 것은 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법이다. 이 기법의 주요 장점중 하나는 사용자 프로그램이 물리 메모리 보다 커져도 된다는 점이다. 배경 많은 경우에 프로그램 전체가 한꺼번에 메모리에 늘 올라와있어야 하는것은 아니다 아래의 예시가 있다. 프로그램에는 잘 발생하지 않는 오류 상황을 처리하는 코드가 종종 존재한다. 이러한 오류들은 거의... » read more