묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
DB에서 데이터가 삭제되지 않습니다.
안녕하세요 강사님. 강사님의 강의를 들으면서 혼자 프로젝트를 진행 중인데 혹시 이런 에러상황도 있을 수 있는지 여쭤보고 싶어서 질문남깁니다. 웹 사이트에서 특정 데이터 값을 삭제를 진행했고, 서버에서도 삭제가 잘 되었다는 로그와 함께 에러없이 삭제 완료되었는데, DB에서 그 값을 검색하면 그대로 남아있는 경우엔 어떻게 해결해야할까요? 삭제를 할때, 테이블의 PK값으로 해당 데이터를 삭제하는 것이 아니고 레코드의 PK말고 다른 값들을 찾아서 그 값이 있으면 데이터를 삭제하라고 로직을 짰거든요.그리고 처음에 기능을 완료했을땐, 잘 삭제가 되었는데 나중에 다시 테스트 진행하니 갑자기 DB에서 삭제가 되지않고 있습니다. // 권한 거부 확인 버튼 클릭 이벤트 핸들러 $(document).on('click', '#confirmRevokePermissionButton', function() { const selectedPermission = $('#permissionSelect').val(); const selectedUsers = $('.user-checkbox:checked').map(function() { return $(this).val(); }).get(); const projPK = $('#projectSettingForm').data('proj-pk'); if (selectedPermission && selectedUsers.length > 0) { $.ajax({ url: `/projMgmt/setting/${projPK}/revokePermission`, type: 'DELETE', data: JSON.stringify({ userPKs: selectedUsers, perPK: selectedPermission }), contentType: 'application/json', success: function(response) { Swal.fire({ icon: 'success', title: '권한 삭제 완료', text: '권한이 성공적으로 삭제되었습니다.', confirmButtonText: '확인' }).then((result) => { if (result.isConfirmed) { loadSetting(projPK); $('#permissionModal').modal('hide'); } }); }, error: function(xhr, status, error) { let errorMessage = '권한 삭제 중 오류가 발생했습니다.<br>'; if (xhr.responseText) { errorMessage += xhr.responseText; } Swal.fire({ icon: 'error', title: '권한 삭제 실패', html: errorMessage, confirmButtonText: '확인' }); } }); } else { Swal.fire({ icon: 'warning', title: '선택 없음', text: '권한을 선택해주세요.', confirmButtonText: '확인' }); } });이렇게 서버로 코드를 보내고 있고,@DeleteMapping("/setting/{projPK}/revokePermission") @ResponseBody public ResponseEntity<String> revokePermissions(@PathVariable Long projPK, @RequestBody Map<String, Object> requestBody) { try { List<Long> userPKs = ((List<?>) requestBody.get("userPKs")).stream() .map(Object::toString) .map(Long::valueOf) .toList(); Long perPK = Long.valueOf(requestBody.get("perPK").toString()); for (Long userPK : userPKs) { log.info("revokePermission projPK: {}, userPK: {}, perPK: {}", projPK, userPK, perPK); userPermissionService.revokePermission(projPK, userPK, perPK); } return ResponseEntity.ok("권한 거부 완료"); } catch (IllegalStateException e) { return ResponseEntity.status(HttpStatus.CONFLICT).body(e.getMessage()); } catch (Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("권한 거부 중 오류가 발생했습니다: " + e.getMessage()); } }서버에서 값을 받으면@Override @Transactional public void revokePermission(Long userPK, Long projPK, Long perPK) { List<UserPermission> userPermissions = userPermissionRepository.findByUser_UserPKAndProject_ProjPKAndPermission_PerPK(userPK, projPK, perPK); if (userPermissions.isEmpty()) { throw new IllegalStateException("해당 사용자는 부여된 권한이 없습니다."); } userPermissionRepository.deleteAll(userPermissions); log.info("Deleted permissions for userPK: {}, projPK: {}, perPK: {}", userPK, projPK, perPK); }보내진 값을 확인하고 값이 있으면 그 값을 삭제하고 값이 없으면 에러 메시지를 발송되게 해놨습니다. 추가로 작성하자면, 체크된 사용자를 권한삭제 버튼을 클릭했을 때권한선택창이 뜨고 수정 권한 삭제를 클릭하면, 완료되었다는 알림창이 뜨고 서버쪽에서는이렇게 로그가 발송되지만, DB에 찾아보면 여전히 값이 남아있는 것이 확인이 됩니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
HellospringApplication을 실행하고, 중지 했을때 에러가 나옵니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 초반에 HellospringApplication의 main 을 실행했을떄 다른거는 다 잘나오는데, stop을 했을경우 위와같이 에러가 나옵니다ㅠㅜ 혹시 그냥 중지해서 나오는걸까요? 아니면 어떤 부분이 잘못된건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Memberform 클래스 사용이 필수인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]@PostMappping("/members/new")public String create()여기에 Memberform form 을 파라미터로 넣었는데,Memberform 클래스를 사용하지 않고 이런식으로 그냥 Member 만 사용해서 바로 join이 가능한가요? 가능하지만 MemberForm 클래스를 활용하는 데 장점이 존재하기 때문에 MemeberForm 클래스를 사용하는건가요?아니면 아예 아래 코드처럼은 불가능한건가요?@PostMapping("/members/new") public String create(Member member) { memberService.join(member); return "redirect:/"; }
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
오늘 결제 했습니다!
오늘 결제 했습니다! 잘 들을게요
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
감사합니다!
오늘 결제 했습니다! 잘 들을게요
-
미해결윤재성의 만들면서 배우는 Spring MVC 5
학습 페이지 가 열리지 않아서 강의 시청이 안 됩니다.
안녕하세요.학습 페이지 가 열리지 않아서 강의 시청이 안 됩니다.모바일에서는 되는데 PC 에서는 안 됩니다.1 시간 째 계속 안 되고 있습니다.사용 브라우저는 Chrome, FireFox 입니다.점검 부탁합니다. 사이트 오류인지요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
학습 전에 데이터베이스 학습을 하고 들어야 할까요?
정처기 기출 정도만 본 적 있는데 어렴풋이 기억이 나는 상태입니다. MVC 1,2편 를 데이터베이스를 잘 모르는 상태로 들어도 될까요?
-
미해결[NarP Series] MVC 프레임워크는 내 손에 [나프2탄]
안녕하세요, Spring Legacy Project 생성 시 오류 문의드립니다.
전자정부프레임워크는 eGovFrame-4.0.0을 사용하고 있으며, https-content.xml 파일을 알려주신C:\eGovFrame-4.0.0\workspace.edu\.metadata\.plugins\org.springsource.ide.eclipse.commons.content.core 경로에 넣어 Spring MVC Project는 나오는 상태입니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HandlerExceptionResolver 질문입니다.
안녕하세요. HandlerExceptionResolver에서 ModelAndView 를 반환하는 이유가 마치 Exception을 정상 흐름처럼 변경하는 것이 목적이라고 하셨는데, 빈 ModelAndView를 반환하면 해당 페이지가 존재하지 않아 또 다른 에러가 생기는 것이 아닌가요?아니면 빈 ModelAndView를 반환하기 전에 response.sendError(xxx)로 서블릿에서 처리하도록 또는 response.getWriter.println("xxx")를 호출하기 때문에 빈 ModelAndView를 반환해도 이상이 없는건가요? 감사합니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
통합테스트
[질문 내용]안녕하세요 수업과 직접적으로 관련된 질문은 아니지만 궁금한 점이 있어서 질문 드립니다.영한님 강의에서는 controller통합테스트를 postman으로 진행하는데restTemplate을 이용해 직접 통합테스트 코드를 짜는것과 포스트 맨을 이용해 테스트하는 것 중 어느것을 더 추천하시는지 궁금합니다또한 직접코드를짜지않고 포스트맨으로 테스트하면 스펙상 불이익이 있는지도 궁금합니다!!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
브라우저 마다 URL이 다르게 전송됩니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]hello-form에 폼 action에 분명 "/request-param-v1"으로 입력되어 있는데 크롬으로 전송하면 "/request-param"으로 url이 바껴버리는 증상이 있습니다. 막상 다른 브라우저로 전송하면 정상적으로 작동하는데 원인을 모르겠습니다..
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프 name 속성 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]타임리프 관련해서 헷갈리는 게 있어서 질문드립니다.강의에서와 똑같이 이 화면에서 페이지 소스 보기를 누르면이렇게 나옵니다. value가 2개 있습니다."127.0.0.1:8080""hello.typeconverter.type.IpPort@59cb0946"만약 제출 버튼을 누르게 되면 "127.0.0.1:8080" 이건 name="ipPort"가 있기 때문에 @PostMapping("/converter/edit") public String converterEdit(@ModelAttribute Form form, Model model) { IpPort ipPort = form.getIpPort(); model.addAttribute("ipPort", ipPort); return "converter-view"; }여기의 Form 객체의 ipPort 필드와 타임리프 속성 name의 "ipPort"가 똑같기 때문에 값이 들어갈 수 있는 거로 이해했는데 맞나요?즉 여기선 타임리프의 name 속성이 중요한 역할을 하고 있는 건가요?그리고 "hello.typeconverter.type.IpPort@59cb0946" 이건 name 속성이 없는데, 제출 버튼을 누르게 되면 이 값은 어떻게 되는지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 gradlew
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.java 환경변수 버전 매칭은 잘 되어있는거 같은데 이렇게 되고 더이상 진행이 안되네요... 윈도우 gradlew build가 안됩니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션 6 requestparam
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Requestparam. V2에서 username과 age를 각각 hello 20 으로 보낸 적이 없는데 왜 알아서 보내지나요
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
id 숫자 건너뜀
다른 질문 글에도 비슷한 내용이 있길래 답변 해주신대로 블로그도 참고해봤는데 해결하지 못 했어요..(33이 아닌 36으로 뜨는 이유는 데이터를 삭제해서 그렇습니다.)
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JPA에서 H2안에 데이터가 안들어갑니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.일단 Hibernate 콘솔에서도 차이가 납니다. 일단은 문제없이 TestCode가 잘되서 끝까지 듣고 하는데 H2에 반영이안되었습니다. 하나하나 찾아보고 전부 다시해보았지만 똑같았습니다...H2 입니다SpringConfig 입니다.dependencies 입니다application.properties 입니다.무엇이 문제인지 알려주시면 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
type=Internal Server Error, status=500
error 500이면 코드가 잘못된 거 같은데 어디가 잘못 됐는지 봐주실 수 있을까요🥺HelloControllerpackage com.example.hello_spring.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloController { @GetMapping("hello") public String hello(Model model){ model.addAttribute("data", "hello!"); return "hello"; } @GetMapping("hello-mvc") public String helloMvc(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); return "hello-template"; } @GetMapping("hello-string") @ResponseBody public String helloString(@RequestParam("name") String name){ return "hello" + name; } jdbcMemberRepositorypackage com.example.hello_spring.repository; import com.example.hello_spring.domain.Member; import org.springframework.jdbc.datasource.DataSourceUtils; import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Optional; public class jdbcMemberRepository implements MemberRepository { private final DataSource dataSource; public jdbcMemberRepository(DataSource dataSource) { this.dataSource = dataSource; } @Override public Member save(Member member) { String sql = "insert into member(name) values(?)"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, member.getName()); pstmt.executeUpdate(); rs = pstmt.getGeneratedKeys(); if (rs.next()) { member.setId(rs.getLong(1)); } else { throw new SQLException("id 조회 실패"); } return member; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findById(Long id) { String sql = "select * from member where id = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setLong(1, id); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } else { return Optional.empty(); } } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public List<Member> findAll() { String sql = "select * from member"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); List<Member> members = new ArrayList<>(); while(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); members.add(member); } return members; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findByName(String name) { String sql = "select * from member where name = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } return Optional.empty(); } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } private Connection getConnection() { return DataSourceUtils.getConnection(dataSource); } private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (pstmt != null) { pstmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { close(conn); } } catch (SQLException e) { e.printStackTrace(); } } private void close(Connection conn) throws SQLException { DataSourceUtils.releaseConnection(conn, dataSource); } }콘솔창 오류메시지 2024-07-20T10:30:05.545+09:00 ERROR 17396 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalStateException: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection] with root cause
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
aop 실행에 대한 이해가 안됩니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.MemberService에서 try/finally및 변수만 설정 해줬을 뿐인데왜 실행은 test->MemberServiceIntegration이 아니라HelloSpringApplication으로 실행을 해야 결과가 나타나게 되나요? 굳이 차이를 못느끼겠는데 왜 그런지 이해가 안가네요
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
첫 강의에서 만든 hello-spring 파일과 IntelliJ관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 IntelliJ에서 프로젝트 파일들을 다루는 부분이 아직 미숙하여 질문드립니다. 1강을 들으면서 실행했을 때는 강의에서 생성한 hello-spring 프로젝트를 상위 폴더인 spring에 담고 spring 폴더로 IntelliJ를 열어서 실행했습니다. 이때는 정상적으로 실행이 되었는데, 다시 실행하려고 보니 실행이 안 됩니다. 다시 다운로드 받고 검색을 해봤지만, 설정에서 idk와 grade관련된 설정만 나왔습니다. 그런데 상위 폴더인 spring이 아닌 spring 프로젝트로 생성한 hello-spring으로 IntelliJ를 실행시키니 정상적으로 폴더들(패키지들)을 인식하고 실행이 됩니다. 원래 이렇게 작동하는 것이 맞는건지 제가 설정 부분을 잘못 건드려서 발생한 문제인지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
member 1, 2 중복 회원 예외 test
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]member 1, 2가 spring으로 동일한데 해당 코드를 실행하면 초록색 표시로 test가 통과하는데 이렇게되면 중복 문제 확인은 어떻게 하나요? 강의를 잘못 이해한 걸까요,,,