일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 분할 정복
- java
- OS
- 시뮬레이션
- 최단 경로
- web
- dfs
- Reversing
- Spring
- c++
- 위상 정렬
- CVE
- 우선순위 큐
- 그리디
- 이분 탐색
- 맵
- thymeleaf
- 스택
- GCP
- error
- BFS
- 백트래킹
- 누적 합
- JPA
- 데이크스트라
- DP
- 문자열
- 구현
- dynamic debugging
- 재귀
- Today
- Total
목록Spring (9)
hades

🚨 에러회원가입을 했을 때, 당연히 하나의 계정이 생성되는 것을 기대한다. 하지만, 우연치 않게 마우스 오동작으로 연속해서 클릭했는데, 데이터베이스에 2개 이상의 같은 계정이 저장되는 문제가 발생했다. 🔍 분석 위와 같이 동시에 요청이 보내지는 경우, 즉, 여러 사용자가 사용하는 프로그램에서 동시에 요청을 보낸다면, 중복확인과 별개로 이와 같은 문제가 발생할 수 있음을 깨달았다. 👊 해결 회원가입에서는 주로 사용자 이름으로 중복여부를 결정하므로, 사용자 이름에 unique 제약조건을 추가한다. 그 후, 오토마우스를 이용하여 짧은 시간에 같은 요청을 여러 개 보내서 발생하는 오류를 확인하니 다음과 같았다.DataIntegrityViolationException이 발생하는 것을 확인할 수 있고, 이..

🚨 에러맨 위의 input인 현재 비밀번호를 올바르지 않게 입력하고, 변경 시 Controller에서 BindingResult에 에러를 더해서 에러 메세지를 나타내고 싶었다. 하지만, 변경 시에는 아무런 에러 메세지가 나타나지 않는다. 왜 이런 것일까? 🔍 분석@PostMapping("/mypage/change")public String changePassword(@Validated @ModelAttribute(name = "passwordDto") PasswordDto passwordDto, BindingResult bindingResult, HttpServletRequest request, Model model){ HttpSession session = request.getSession();..

본 글은 프로젝트를 진행하면서, AI에 질문을 하고 응답을 받아야 하는 서비스를 구현하기 위해 AI api를 학습하면서 작성하는 글이다. Spring에서는 AI를 매우 쉽게 지원해주는 dependency가 있다. 유튜브의 링크도 필요했기 때문에 같은 구글 서비스인 Gemini AI를 사용하기로 했다. 처음, build.gradle에서 Edit Starters로 아래와 같이 Gemini AI를 추가하고 했다.하지만, dependency가 인식되지 않고, 빨간줄 천지가 되었다. 캐시 삭제, 재빌드 등 여러가지 방법을 시도해보았지만 해결할 수 없었다. (깊은 빡침) 혹시나 해서 Spring Initilizr를 이용하여 Gemini를 추가한 새로운 프로젝트를 만들고, build.gradle을 확인해보았다. 새롭..

프로젝트를 진행하던 도중, 파일 업로드 기능이 필요하여 학습 후, 프로젝트를 기반으로 정리한 글이다. 본인은 게시글에 이미지 파일을 올리는 것을 목표로 하였고, 그로 인해 게시글과 파일 간의 연관관계가 있다. Multipart문자, 숫자 데이터는 기본적으로 application/x-www-form-urlencoded 방식을 이용한다. 하지만, 파일은 이들과 다르게 바이너리 데이터로 보내야 한다. 문자, 숫자, 파일을 동시에 보내야 하는 경우에 문제가 발생한다. 이를 해결하는 것이 Form 태그에 enctype="multipart/form-data" 를 추가하는 것이다. Content-Disposition에 의해 구분되고, 파일은 추가적으로 filename과 Content-Type이 추가되고 바이너리 데..
🚨 에러Model has no value for key foodId 🔍 분석@PostMapping("post/delete/{id}")public String deletePost(@PathVariable(name = "id") Long id, RedirectAttributes redirectAttributes){ Post post = postService.findPost(id); Long foodId = post.getFood().getId(); postService.remove(id); return "redirect:/food/foodInfo/{foodId}"}id로 post를 찾고, post와 연결된 foodId를 찾아 redirect 경로 안에 넣어주었다. @GetMappin..

프로젝트 환경설정 H2와 Thymeleaf 동작 확인 후, application.yml 파일 생성Spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop; username : sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate:# show_sql: true format_sql: truelogging: level: org.hibernate.SQL: debugddl-auto: create는 애플리케이션 실행 시점에 테이블을 새로 생성한다. Membe..

🚨 에러Parameter 0 of constructor in hello.core.member.MemberServiceImpl required a single bean, but 2 were found: - memoryMemberRepository: defined in file [C:\Users\hades\Desktop\study\core\out\production\classes\hello\core\member\MemoryMemberRepository.class] - memberRepository: defined by method 'memberRepository' in class path resource [hello/core/AppConfig.class] 🔍 분석MemberServiceImpl이 하나의 ..

스프링 컨테이너와 스프링 빈스프링 컨테이너 생성ApplicationContext는 스프링 컨테이너이자 인터페이스이다. 따라서 다형성이 적용된다. AnnotationConfigApplicationContext도 있고, 다른 ApplicationContext들도 있다.설정임을 나타내는 @Configuration이 붙은 AppConfig.class를 매개변수로 하는 AnnotationConfigApplicationContext을 생성하면, @Bean이 붙은 것들이 스프링 저장소에 저장된다. 빈 이름은 메소드 이름, 빈 객체는 return 값이다. 빈의 이름은 기본적으로 메소드 이름이며, 항상 다른 이름을 부여해야 한다. 3. 스프링 빈 의존 관계 설정스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입한다...

프로젝트 생성Spring 프로젝트는 https://start.spring.io/ 에서 생성한다.기본적으로 위와 같이 설정 후 Generate하면 프로젝트가 생성된다. 구성 항목들을 살펴보자. src에서 main과 test를 분리해놓았는데, 이는 test가 요즘 개발에서 중요하다는 것을 의미한다.main에서 java를 제외한 모든 파일은 resources에 있다. gradle은 버전 설정 및 라이브러리를 가져오는 역할을 한다. HelloSpringApplication은 Application을 실행시키는데 자체적으로 서버 기능을 할 수 있게 해주는 톰캣을 내장하고 있어서, 서버 역할을 가능하게 한다. Setting - Build - Gradle에서 IntelliJ IDEA로 바꾸면, 자체적으로 실행하여 빨라..