전체 글333 8)Validation(검증) , 오류 코드와 메시지처리 (4 ~ 6) 우선 테스트 코드로 MessageCodesResolver를 알아보자. MessageCodesResolver는 인터페이스이고 안의 메소드를 보면 주어진 에러코드와 필드설명을 받아서 에러코드들 (String[]) 을 반환해준다. 필드에러의 코드리스트를 만드는데 사용된다고 한다. ObjectError 테스트 Object Error는 객체의 에러인데 그 객체의 필드에러를 넘어서는 복합적인 에러를 만들때 생성해서 bindingResult에 담아둔다. public class MessageCodesResolverTest { MessageCodesResolver codesResolver = new DefaultMessageCodesResolver(); // 구현체는 DefaultMessageCodesResolver를 .. 인프런/스프링 MVC 2편 2023. 2. 3. 7) Validation (검증) , 프로젝트 (V1 ~V2) ,오류 코드와 메시지처리 (1~3) 검증 요구사항 지금까지 만든 웹 애플리케이션은 폼 입력시 숫자를 문자로 작성하거나해서 검증 오류가 발생하면 오류 화면으로 바로 이동한다. 이렇게 되면 사용자는 처음부터 해당 폼으로 다시 이동해서 입력을 해야 한다. 아마도 이런 서비스라면 사용자는 금방 떠나버릴 것이다. 웹 서비스는 폼 입력시 오류가 발생하면, 고객이 입력한 데이터를 유지한 상태로 어떤 오류가 발생했는지 친절하게 알려주어야 한다. 에러뜨면 이동하는 화면은 아래 페이지를 말하는것이다. 컨트롤러의 중요한 역할중 하나는 HTTP 요청이 정상인지 검증하는 것이다. 그리고 정상 로직보다 이런 검증 로직을 잘 개발하는 것이 어쩌면 더 어려울 수 있다. 검증 직접 처리 고객이 상품 등록 폼에서 상품명을 입력하지 않거나, 가격, 수량 등이 너무 작거나 .. 인프런/스프링 MVC 2편 2023. 2. 3. spring)message 파일의 값들이 ???로 나올때 required.item.itemName=상품 이름은 필수입니다. range.item.price=가격은 {0} ~ {1} 까지 허용합니다. max.item.quantity=수량은 최대 {0} 까지 허용합니다. totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1} 이렇게 작성해놨던 메시지파일이 빌드를 하고나니 한글이 다 ?로 바뀌었다 file -> setting -> 다 바꾸고, 인텔리제이를 껐다키고 다시 required.item.itemName=상품 이름은 필수입니다. range.item.price=가격은 {0} ~ {1} 까지 허용합니다. max.item.quantity=수량은 최대 {0} 까지 허용합니다. totalPriceMin=가격 * 수량의 합은 {0}원.. 문제해결 2023. 2. 3. 6) 메시지 ,국제화 메시지 기획자가 화면에 보이는 문구가 마음에 들지 않는다고, 상품명이라는 단어를 모두 상품이름으로 고쳐달라고 하면 어떻게 해야할까? 여러 화면에 보이는 상품명, 가격, 수량 등, label 에 있는 단어를 변경하려면 그게 존재하는 뷰템플릿으로 가서 모두 수정해줘야한다. 화면 수가 적으면 문제가 되지 않지만 화면이 수십개 이상이라면 수십개의 파일을 모두 고쳐야 한다. 왜냐하면 해당 HTML 파일에 메시지가 하드코딩 되어 있기 때문이다. 이런 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다. 국제화 메시지에서 한 발 더 나가보자. 메시지에서 설명한 메시지 파일( messages.properties )을 각 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다. 예를 들어서 다음과 같이.. 인프런/스프링 MVC 2편 2023. 2. 2. 5)타임리프 - 라디오버튼,셀렉트박스 라디오버튼 라디오 버튼은 여러 선택지 중에 하나를 선택할 때 사용할 수 있다. 이번시간에는 라디오 버튼을 자바 ENUM을 활용해서 개발해보자. @ModelAttribute를 이용해서 컨트롤러의 모든 메소드의 모델에 값을 넣자 @ModelAttribute("itemTypes") public ItemType[] itemTypes() { return ItemType.values(); // // enum.values를 하면 저장되어있는 값들을 배열로 넘겨준다. } enum타입은 .values()로 값들을 가져올 수 있따. 상품 종류 BOOK itemTypes 데이터로 받아온 enum배열을 하나씩 type에 저장한다. th:field에 Item.itemType을 넣는다. th:value에는 type.name()을.. 인프런/스프링 MVC 2편 2023. 2. 2. 4)타임리프 적용,체크박스,멀티체크박스 타임리프 타임리프는 크게 2가지 메뉴얼을 제공한다. 기본 메뉴얼 https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 타임리프 + 스프링 (스프링 통합 메뉴얼) https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html 타임리프는 스프링 없이도 동작하지만, 스프링과 통합을 위한 다양한 기능을 편리하게 제공한다. 그리고 이런 부분은 스프링으로 백엔드를 개발하는 개발자 입장에서 타임리프를 선택하는 하나의 이유가 된다. 설정방법 https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#the-springstandard-dialect h.. 인프런/스프링 MVC 2편 2023. 2. 2. 3) 타임리프 (블록 , 자바스크립트 인라인 , 템플릿 조각, 템플릿 레이아웃) 블록 타임리프의 유일한 자체 태그 블록 테스트 컨트롤러 @GetMapping("/block") public String block(Model model) { addUsers(model); return "basic/block"; } private void addUsers(Model model) { List list = new ArrayList(); list.add(new User("userA", 10)); list.add(new User("userB", 20)); list.add(new User("userC", 30)); model.addAttribute("users", list); } 모델에 리스트를 넣어 뷰를 렌더링한다. 뷰 템플릿 사용자 이름1 사용자 나이1 요약 위의 코드를 보면 th:each를 통.. 인프런/스프링 MVC 2편 2023. 2. 1. 2)타임리프 (리터럴,연산,속성값설정,반복,조건부 평가,주석) 리터럴 리터럴은 소스 코드상에 고정된값을 말하는 용어이다. 예시를 보면 hello는 소문자가 연속된 문자이므로 작음 따옴표를 생략할 수 있다. 리터럴 테스트 컨트롤러 @GetMapping("/literal") public String literal(Model model) { model.addAttribute("data", "Spring!"); return "basic/literal"; } 뷰 템플릿 'hello' + ' world!' = 'hello world!' = 'hello ' + ${data} = 리터럴 대체 |hello ${data}| = 리터럴 끼리 더하는연산도 가능하고, 리터럴과 변수를 더하는것도 가능하다. 마지막에 리터럴 대체문자를 이용해서, 합치는 예시인데 작은 따음표도 필요없고, 공백도.. 인프런/스프링 MVC 2편 2023. 2. 1. insert할때 자동으로 생성되는 키값 가져오기 [미완] 2가지 방법이 존재 1. useGeneratedKeys와 KeyProperty사용하기 insert into review (content) values (#{content}) public class CreateReviewRequest { private long roomId; private long userId; private long reviewId; private long reservationId; private String content; review라는 테이블에 데이터를 생성하면 AUTOINCREMENT 덕분에 review테이블의 id라는 컬럼의 값이 알아서 증가되면서 들어간다. 그때 방금 생성된 로우(레코드,튜플)의 id값을 가지고싶다면 useGeneratedKeys와 KeyProperty사용를 사.. 데이터베이스/MyBatis 2023. 2. 1. Spring) 등록된 Bean 확인하기 @SpringBootApplication public class AirbnbApplication implements CommandLineRunner { @Autowired private ApplicationContext ac; public static void main(String[] args) { SpringApplication.run(AirbnbApplication.class, args); } @Override public void run(String... args) throws Exception { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); Arrays.sort(beanDefinitionNames); for (String beanDef.. Spring/Spring 2023. 1. 31. MyBatis) @Mapper붙은 Mapper가 스프링빈으로 등록되지않는다. @Mapper public interface ReviewMapper { 이런식으로 @Mapper를 붙여놨는데도 ReviewMapper가 스프링빈으로 등록되어있지않아 찾을 수 없다면서 서버가 켜지지않았다. 그때나의 MyBatis 버전은 2.2.0이였다. 그리고 스프링부트는 3.0.1이였다. implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0' 하지만 MyBatis의 springboot 문서를 보면 스프링부트가 2.5 - 2.7 버전인 사람만 mybatis-spring-boot-start 2.2 버전을 사용할 수 있다고한다. 바로 수정해주었다. implementation 'org.mybatis.spring.boot:mybatis.. 문제해결 2023. 1. 31. h2) 인텔리제이에 h2 데이터베이스를 연결해도 테이블이 보이지않는 문제 연결 테스트에는 성공했지만 인텔리제이 오른쪽 아래 구석에 다음과 같은 에러가 뜨고 [42S02][42102] org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "INFORMATION_SCHEMA_CATALOG_NAME" not found; SQL statement: select CATALOG_NAME from INFORMATION_SCHEMA.INFORMATION_SCHEMA_CATALOG_NAME [42102-210]. 테이블이 보이지않았다. 해결방법 https://stackoverflow.com/questions/72255338/intellij-embedded-h2-database-tables-do-not-appear Intellij embedded H2 databa.. 문제해결 2023. 1. 31. 이전 1 ··· 10 11 12 13 14 15 16 ··· 28 다음