[스프링] - redirectAttribute.addFlashAttribute() 동작 원리 (feat. 쿠키와 세션) 1. addFlashAttirbute()의 특이한 점 스프링에서 아래와 같은 addFlashAttribute() 코드를 통해 일시적으로 데이터를 전달할 수 있다. @GetMapping("/register") public void register() { } @PostMapping("/register") public void register(@Valid RegisterDTO registerDTO, BindingResult bindingResult, RedirectAttribute redirectAttribute) { if ( bindingResult.hasErrors ) { redirectAttribute.addFlashAttribute("errors", bindingResult.getAllErrors()).. 2024. 1. 26. [그레이들] - 스프링 웹 프로젝트의 구조와 빌드 1. 그레이들 프로젝트 구조 서버측 자바 웹 애플리케이션은 그레이들(Gradle)이나 메이븐(maven)과 같은 빌드툴(Build Tool) 프로그램을 사용해서 프로젝트를 관리한다. 물론 이렇게 사용하지 않고 이클립스나 인텔리제이가 제공하는 기본 프로젝트 템플릿 구조에 일일이 폴더를 만들고, 라이브러리를 다운받고, 패키징을 할 수도 있다. 그러나 이 과정이 매우 번거롭기 때문에 실무에서는 그냥 그레이들이나 메이븐을 사용한다. 내가 빌드툴을 잘 사용하는 것은 아니라 자세히는 모르지만, 프로젝트 빌드라는 것은 소스코드와 각종 파일 자원을 가지고 실제 활용 가능한 프로그램을 생성하는 일을 일컫는다. 자바 웹 프로젝트의 경우 war 파일을 만드는 것이다. (혹은 스프링부트처럼 웹 서버가 내장된 경우 jar 파일.. 2024. 1. 25. [피드백] - 실제 서비스가 아니라 서비스화부터 신경쓰자 1. 라는 책을 흥미롭게 읽은 기억이 있다. 이 책의 초반에는 개발자의 등급을(?) 분류하는 기준이 저자(우쥔)에 의해 제공되어 있다. 저자는 자연어 처리 전문가로 구글에서 일하면서 겪은 개발자들을 다음과 같은 기준으로 분류할 수 있다고 한다. 5등급 : 독립적으로 문제를 해결하고 소프트웨어를 온전히 완성할 수 있다. 4등급 : 최신식 방법으로 문제를 해결하고, 다른 사람들을 이끌어 영향력 있는 개발자로 성장시킬 수 있다. 3등급 : 독립적으로 제품을 설계하고 시장에서 성공할 수 있다. 2등급 : 중요한 컴퓨터 이론과 실천에 있어 새로운 문제를 제기할 수 있다. 1등급 : 산업을 개척하고 이론적 기반을 만들 수 있다. 참고로 저자가 생각하는 7등급의 기준은 우수한 대학의 컴퓨터 공학과를 전공한 수준이다... 2024. 1. 25. [JPA] - N+1 문제 및 @BatchSize의 의미와 Hibernate의 캐싱 전략 1. N+1 문제 JPA에서 엔티티가 서로 @OneToMany, @OneToOne, @ManyToOne 등으로 연결 관계를 형성한 경우, DB에서 엔티티를 가져올 때 연결된 객체를 어떻게 가져올지 전략을 잘 세워야 한다. 세부적인 내용은 아래 포스팅에 작성했으니 참고. [JPA] -연관관계가 있을 때 영속성 처리법과 cascade JPA 기술은 너무나 편리하지만, 한편으로 신경써야 할 것도 꽤 많다. 특히 테이블 사이의 연관관계가 형성될 때, JpaRepository에서 영속 처리를 하면 연관 관계에 있는 다른 엔티티들은 도대체 어떻 linocraft.tistory.com 일반적으로 연결된 객체를 한 번에 조인으로 가져오지 않고, 필요한 순간에만 다시 DB에 요청을 해서 가져오는 형태를 사용한다. 이것을.. 2024. 1. 25. [JPA] -연관관계가 있을 때 영속성 처리법과 cascade JPA 기술은 너무나 편리하지만, 한편으로 신경써야 할 것도 꽤 많다. 특히 테이블 사이의 연관관계가 형성될 때, JpaRepository에서 영속 처리를 하면 연관 관계에 있는 다른 엔티티들은 도대체 어떻게 처리할지 생각해야 한다. 1. select는 지연 로딩과 즉시 로딩, 그리고 조인(JOIN) JpaRepository에서 findById()와 같은 메소드로 엔티티 객체를 가지고 오는 경우, 내부의 엔티티를 어떻게 가져올지 결정해야 한다. 처음 생각해야 할 것이 지연 로딩(LAZY)과 즉시 로딩(EAGER)이다. @Entity public class Reply { // .... @ManyToOne(fetch = FetchType.LAZY) private Board board; } 지연 로딩(LAZY.. 2024. 1. 24. [JPA] - 영속성 컨텍스트와 지연 로딩(LAZY) 1. 지연 로딩이란? 아래와 같은 아주 간단한 Reply(댓글) Entity 클래스가 있다. @Entity public class Reply { @Id private Long rno; @ManyToOne(fetch = FetchType.LAZY) private Board board; } 댓글(Reply) 엔티티는 Board(게시판) 엔티티와 연결되어 있고, 그 관계는 댓글이 Many, 게시판이 One 관계다. 즉, 게시판 하나에 여러 개의 댓글이 달린 형태이며, 데이터베이스에서는 댓글(Reply) 테이블에 FK가 설정될 것이다. 만약 ReplyRepository 영속성 객체에서 댓글 하나를 가져온다고 하자. public void getReply() { Option option = replyReposito.. 2024. 1. 24. Model Mapper Deep 매핑 방법?? MVC 패턴에서 컨트롤러와 뷰, 모델 사이에는 DTO라는 데이터 박스를 사용해 데이터를 한꺼번에 전달한다. 이는 컨트롤러와 서비스에서도 마찬가지인데, 이렇게 해야 웹 레이어와 서비스 내부(도메인과 레포지토리)를 개념적으로 분할할 수 있다. 그러나 서비스 내부에서는 DTO를 도메인의 VO와 같은 객체로 변환을 해야 하며, 이를 위해 Model Mapper와 같은 라이브러리가 사용된다. 그런데 Model Mapper는 객체 내부에 객체가 있는 경우엔 그것을 매핑하지 않는 것으로 보인다. 예를 들어, ReplyDTO 객체에 bno가 있다. ReplyDTO를 Reply 객체로 변환하고 싶은데, Reply에는 Board 객체가 있고, Board 객체에 bno 필드가 있다. Model Mapper는 ReplyDTO.. 2024. 1. 23. 과잉 학습의 중요성 박문호 박사가 말했듯이, 기본적인 데이터가 머리에 있어야 감정이 생기고, 그게 자신감으로 이어진다. 지금 내가 해야할 것은, 최대한 머릿속에 데이터를 넣고, 그것을 자주 꺼내보면서 방대한 시스템을 구축하는 것이다. 그리고 여기서 자신감을 얻는 것이다. 머릿속에 디테일을 넣지 못하면 평생을 "이 기술 본 적 있는데.." 수준에 그치게 된다. 아주 위험한 일이다. 이때 중요한 것은 과잉 체화다. 라는 책을 보면 한 사람이 제대로 학습하기 위해서는 특정 영역에 대한 과잉 학습이 필요하다고 말한다. 예를 들어, 영어로 말을 하려면 먼저 알파벳은 무의식적으로 읽을 수 있도록 완전히 체화해야 할 것이며, 이를 위해 과잉 학습이 전제되어야 하는 것이다. 한 기술을 과잉 체화시켜야만 다음 내용을 정신적으로 수용할 수 .. 2024. 1. 22. [swagger] - 스프링부트 3.x 이상 사용 시 swagger 설정법 강의와 책에서 Swagger-UI를 사용할 때 아래와 같은 의존성을 다운받으라고 안내한다. implementation 'io.springfox:springfox-boot-starter:3.0.0' implementation 'io.springfox:springfox-swagger-ui:3.0.0' 그러나 스프링부트 3.x 버전 이상부터는 더 이상 springfox 계열의 swagger는 업데이트되지 않는다. 따라서 다른 의존성을 사용해야 한다. implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' OpenAPI 3 Library for spring-boot Library for OpenAPI 3 with spring boot p.. 2024. 1. 22. 이전 1 2 3 4 5 6 7 8 ··· 16 다음