전체 글 555

스프링 메시지 / 국제화

본 포스트는 김영한님의 인프런강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 보고 정리한 포스트입니다. 자세한 내용은 강의를 참고해주세요 *메시지 / 국제화 기획자가 화면에 보이는 문구가 마음에 들지 않는다고 상품명이라는 단어를 모두 상품이름으로 고쳐달라고 하면 어떻게 해야할까? 여러 화면에 보이는 상품명, 가격, 수량 등 laebl에 있는 단어를 변경하려면 다음 화면들을 다 찾아가면서 모두 변경해야한다. 이는 페이지가 많으면 많을수록 더 난감해진다. 이렇게 난감해지는 이유는 해당 html파일에 메시지가 하드코딩 되어있기 때문이다. 하드코딩이란? 데이터를 코드 내부에 직접 입력하는 것, 기술적으로는 데이터가 실행 바이너리에 합쳐져 있는 상태를 말한다. 반대말은 소프트코딩 또는 로딩이라고 한다. ..

Spring/Spring 2021.10.18

타임리프심화1

본 포스트는 김영한님의 인프런강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 보고 정리한 포스트입니다. 자세한 내용은 강의를 참고해주세요 *입력 폼 처리 지금부터 타임리프가 제공하는 입력 폼 기능을 적용해서 기존 프로젝트의 폼 코드를 타임리프가 지우너하는 기능을 사용해서 효율적으로 개선해보자 -th:object : 커맨드 객체를 지정한다. -*{...} : 선택 변수 식이라고 한다. th:object에서 선택한 객체에 접근한다. -th:field : html태그의 id, name, value 속성을 자동으로 처리해준다. 랜더링 전 랜더링 후 th:object를 적용하려면 먼저 해당 오브젝트 정보를 넘겨줘야한다. @GetMapping("/add") public String addForm(Model..

Spring/Spring 2021.10.16

타임리프기본2

본 포스트는 김영한님의 인프런강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 보고 정리한 포스트입니다. 자세한 내용은 강의를 참고해주세요 *반복 타임리프에서 반복은 th:each를 사용한다. 추가로 반복에서 사용할 수 있는 여러 상태 값을 지원한다. 반복 시 오른쪽 컬렉션 ${users}의 값을 하나씩 꺼내서 왼쪽 변수에 담아서 태그를 반복 실행한다. th:each는 List 뿐만 아니라 배열, Iterable, Enumeration을 구현한 모든 객체를 반복에 사용할 수 있다. Map도 사용할 수 있는데 이 경우에 변수에 담기는 값은 Map.Entry이다. 반복 상태 유지 기능 -index : 0부터 시작하는 값 -count : 1부터 시작하는 값 -size : 전체 사이즈 -even, odd..

Spring/Spring 2021.10.15

타임리프기본1

본 포스트는 김영한님의 인프런강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 보고 정리한 포스트입니다. 자세한 내용은 강의를 참고해주세요 *기본 객체들 타임리프는 기복 객체들을 제공한다. 1. ${#request} 2. ${#response} 3. ${#sesison} 4. ${#servletContext} 5. ${#locale} 그런데 #request는 HttpServletRequest객체가 그대로 제공되기 때문에 데이터를 조회하려면 request.getParameter("data")처럼 불편하게 접근해야 한다. 이런 점을 해결하기 위해 편의 객체도 제공한다. HTTP요청 파라미터 접근 ${param.paramData} HTTP세션 접근 ${session.sessionData} 스프링 빈 접..

Spring/Spring 2021.10.13

Querydsl 오류 org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'order1.orderStatus' / antlr.NoViableAltException: unexpected end of subtree / antlr.SemanticException: left-hand operand of a binary operator was null

InvalidPathException, NoViableAltException, SemanticException 이 세개가 동시에 떠서 굉장히 당황했다. 구글링을 해봐도 별다른 수확이 없었다. 그렇게 30분동안 내 코드를 뚫어져라 쳐다본 결과 굉장히 어이없는 실수였다. 그렇다 조인이 없다... 어이없어서 다신 실수하지 말자는 의미로 이렇게 글을 남긴다.

오류해결 2021.10.03

Querydsl 실무활용

*스프링 데이터 JPA에서의 QueryDSL 사용 사용자 정의 리포지토리를 사용하면 된다. (Spring Data JPA 참고) *QueryDSL 페이징 연동 + 스프링 데이터 JPA 1. 사용자 정의 리포지토리를 사용해서 구현체를 만든다. 2. 인자값으로 Pageable을 넘긴다. 3. queryFactory에서 offset메서드, limit메서드를 사용한다. // offset(pageable.getOffset()), limit(pageable.getPageSize()) 4. fetchResults()메서드로 최종연산을 마무리 짓는다. // 이유 : 페이징 처리를 하려면 전체 데이터 개수를 알고 있어야 하므로 5. total사이즈를 뽑는다. fetchResults()의 결괏값으로 QueryResults..

JPA/QueryDSL 2021.10.01

Querydsl 중급문법

*프로젝션과 결과 반환 프로젝션 : select 대상 지정 -프로젝션 대상이 하나일 때 (단일 타입) List result = queryFactory.select(member.username).from(member).fetch(); 1. 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있음 2. 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회 -프로젝션 대상이 둘 이상일 때 (튜플 사용) List result = queryFactory.select(member.username, member.age).from(member).fetch(); -사용방법 for (Tuple tuple : result) { String username = tuple.get(member.username); Integer ag..

JPA/QueryDSL 2021.10.01