본문 바로가기

전체 글273

[JAVA] 객체(Model) 를 통으로 화면에 찍기 (대체:@Data, .toString()) 이번에 신규 프로젝트를 작업하면서, 화면을 작업하다가 객체에 내가 원하는 데이터가 잘 있는지 디버깅해보고 싶어서 사용했던 방법을 공유하고자 글을 작성한다. 보통 화면에서 객체 디버깅을 한다면, 1. lombok 의 훌륭한 @Data 어노테이션을 사용하거나, 2. .toString() 메소드를 오버라이딩으로 확인하면 되겠지만, 이 글에선 두 방법 모두 사용하지 않고 Gson 으로 디버깅하였다. === TMI 개인적으로 @Data 어노테이션 남발을 금지하고, .toString() 오버라이딩은 지저분해보이고 별로 선호하지 않기 때문에.. 핵심은 GsonBuilder 의 .setPrettyPrinting() :) /** * 화면 출력용 컨트롤러 (임시) todo: 테스트 끝나면 제거 */ @PostMapping.. 2020. 5. 11.
[ERROR] org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) Mybatis 로 개발하다가 발생한 에러. 처음엔 에러만 읽고 무언가 Binding 을 못했다길래 1. 부분과 2. 쿼리에서 parameterType 부분과 3. @MapperScan('') 부분도 봤는데 잘 되어있어서 좀 헤맸다.. ㅎ 구글링하니까 Interface 경로를 못찾는 경우가 태반이라 그래서, 경로가 올바른지에만 집중했었는데 나의 에러는 경우가 조금 달랐다. 단순 오타가 아닌 경로의 문제 였으니까... 원인 : main/java/.../..Mapper.class 경로와 resources/.../..Mapper.xml 경로가 일치해야 한다. 해결 : m.. 2020. 4. 6.
[MyBatis] PK가 없으면 INSERT, 있으면 UPDATE -> LIST 로 처리하기 개발자라면 한 번 쯤은 들어봤을.. 있으면 INSERT, 없으면 UPDATE .. Model 을 하나씩 받아서 처리하면 더할나위 없이 좋겠지만, Model 을 List 로 받아서 처리해야 될 때도 있다. 여기까진 단순하게 조금만 구글링하면 나온다. // in mapper void insertUserInfo(@Param("userInfoList") List userInfoList); // in xml INSERT INTO user_info ( user_no, user_id, user_name ) VALUES ( #{userNo}, #{userId}, #{userName} ) 근데 이제 여기서 userNo(PK라고 가정하자) 가 없으면 INSERT, 있으면 UPDATE 해야 된다면 ?? // in xml I.. 2020. 4. 2.
[MyBatis] #{} 와 ${} 의 차이 MyBatis Framework 를 사용하여 개발을 하다가 문득, 이런 생각을 했다. " 다른 사람들 코드를 보면 ${} 로도 하던데, 내가 쓰는 #{} 와 무슨 차이가 있을까? " 결론만 말하자면, #{} 는 String 을 표현해준다. 즉, 앞 뒤로 홀따옴표(') 를 붙여준다 :) INSERT INTO user ( id, name ) VALUES ( #{id}, #{name} ) --> VALUES ('homeju1', '홈주') 반면, ${} 는 있는 그대로를 표현해준다. 그렇기 때문에 숫자형을 사용할 때 좋다 :) INSERT INTO user ( id, age ) VALUES ( #{id}, ${age} ) --> VALUES ('homeju1', 26) 2020. 4. 2.
[Java] 문자열이 Enum 에 포함되어 있는지 확인하는 방법 입력받은 문자열에 대한 검증이 필요했고, 그 문자열은 Enum 으로 관리하는 영역에 대한 문자열이었다. 고로.. 나는 입력받은 문자열이 Enum 의 값과 일치하는지 확인해야했다 :) #1. Stream 사용 Arrays.stream(이넘.values()).anyMatch(v -> v.name().equals(문자열)); #2. Enums 메소드 사용 Enums.getIfPresent(이넘.class, 문자열).isPresent(); #3. EnumUtils 사용 // 기본 EnumUtils.isValidEnum(이넘.class, 문자열); // 기본 + 대소문자 무시 EnumUtils.isValidEnumIgnoreCase(이넘.class, 문자열); 이 중 3번째 방법이, 대소문자 무시해주는 메소드가 .. 2020. 3. 23.
[Spring] Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported [Handler] Throwable Error!!! uri: {호출한 URI}, trace: org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported 개요 : 단순 form 에 데이터 넣고 submit 때린 것 밖에 없는데.. 왜 받질 못하니 😭 @PostMapping("/{호출할 URI}") @ResponseBody public Object myTestMethod(@RequestBody TestModel testModel) { // 수행코드 } 원인 : 다른 POST 통신할 때와 동일하게 모델을 @RequestBody.. 2020. 3. 20.
[JavaScript] 헷갈리지 말자! for loop 유형 (in, of) 화면단 스크립트를 짜면서 for 문을 도는데, 뭔가 이상하다 🤨 ... 왜 for loop 이 내가 원하는대로 안돌까 ... !!!!! 그 이유를 찾고, 앞으로 헷갈리지 않기 위해 작성하는 포스팅 :) 1. for in loop for in loop 는, for loop 를 "Index" 기준으로 돈다. 2. for of loop for of loop 는, for loop 을 "value" 기준으로 돈다. jQuery 대신 자바스크립트로 풀어야 할 땐 이 점 유의해서 원하는 for loop 를 사용하자 😉 2020. 3. 12.
[JAVA] 사용했던 정규식 모음 DTO 에 받는 필드들의 유효성 검증을 위해 @Pattern 어노테이션을 활용하기로 했다. 그 중 사용했던 정규식을 잊지 않기 위해 정리함.. 😊 1. 우편번호 포멧 (6자리 숫자 또는 건물번호(n, nn, n-nn, nn-n, nn-nn)) [0-9]{4}[-]?[0-9]{2}[-]?[0-9]{2} "123-456" -> 성공 "12-34" -> 성공 "1234" -> 성공 "1234-" -> 실패 2. 날짜 포멧 (YYYY-MM-DD 또는 YYYYMMDD) [0-9]{4}[-]?[0-9]{2}[-]?[0-9]{2} "20200202" -> 성공 "2020-02-02" -> 성공 "2020-0202" -> 성공 "202002021" -> 실패 "2020-02--02" -> 실패 3. 비밀번호 포멧 (숫.. 2020. 3. 10.
[ReactJS] 천천히, 부지런히 배워본 후기 (feat.nomadcoders) ReactJS.. VueJS.. 핫한 프론트엔드 프레임워크인 2개를 평소에 배워보고 싶다는 마음만 존재했다. 하지만 !!! 이 마음은 니꼴라스 선생님을 만나 행동으로 실천할 수 있게 되었고, 덕분에 ReactJS 에 한 발 내딛을 수 있었다. 이 글은 Nomadcoders 페이지에서 ReactJS 강의를 완강한 후 작성한 회고입니다. 친절하고 유쾌하지만 설명을 맛깔나게 잘하는 니꼴라스 선생님 덕분에, 리액트를 배워볼 수 있었다. => 결과물 확인하기 # 정리 리액트로 간단한 페이지를 구현하면서, 사용되었던 lib 는 아래와 같았다. "dependencies": { "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.4.1", "@te.. 2020. 3. 7.