묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 부트 개념과 활용
강의 진행되로 똑같이 했는데 jquery가 실행되지 않았는데
<script src="">https://code.jquery.com/jquery-3.3.1.min.js"></script> <script>jQuery(document).ready(function(){alert('ready!');});</script> junit5 인데 변경을 했더니 실행이 되었네요
-
미해결쥬쥬와 함께 하루만에 끝내는 스프링 테스트
flyway jdbcdriver 오류
https://www.inflearn.com/questions/1199599/m1-mac-도커-컴포즈-docker-compose-up-에러안녕하세요 이전에 docker-compose에서 flyway를 띄울 때 오류가 있어 질문을 드렸습니다.말씀해주신대로 버전을 변경해서 실행을 하니 해당 오류는 발생하지 않으나 다른 에러가 발생하였습니다.ERROR: Unable to instantiate JDBC driver: com.mysql.cj.jdbc.Driver => Check whether the jar file is presentCaused by: Unable to instantiate class com.mysql.cj.jdbc.Driver : com.mysql.cj.jdbc.DriverCaused by: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver 나름대로 구글링해본 결과 직접 jdbc 파일을 넣어주어야 한다고 하는데 이렇게 하는게 맞을까요?flyway의 github에 들어가서 compose 파일을 확인하니 alphine 리눅스로 되어 있던데 jdbc driver jar파일을 다운받으려고 사이트를 들어가니 알파인 리눅스용 드라이버는 없던데 어떻게 해야할까요? 강사님으로부터 flyway를 처음 알게되었는데 유용할 것 같아 넘어갈 수 있는 부분이지만 다시 질문드리게 되었습니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의에서 테스트 코드에서 insert 쿼리문이 발생합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.JUnit5 로 진행하고 강의에서 내용 그대로 작성을 하였는데, insert 쿼리문이 발생했습니다..8:54 초 내용에서 @Transactional 어노테이션을 붙이면 자동으로 롤백해버리기 때문에 DB에 insert를 날릴 이유가 없다고 하셧는데.. 왜이러는걸까요..ㅠㅠ h2 데이터베이스를 사용한 것이 아닌 mysql 데이터베이스를 연결하였지만 그거 말고 다른 설정들은 다 동일하거든요
-
해결됨실전! 스프링 데이터 JPA
findById 동시성 테스트 실패
MemberRepository는 jpaRepository인 상태이고,findById관련해서 동시성 테스트를 하고 있는데, 해당 테스트가 통과를 하지 않아 그 이유가 궁금합니다. 단순하게 여러 스레드에서 findById하는 테스트 코드인데 왜 통과를 못하는지 잘 이해가 가지 않습니다. @SpringBootTest @Transactional public class Test{ @Autowired MemberRepository memberRepository; Member member; @BeforeEach void setUp() { member = Member.builder().name("testMember").build(); memberRepository.save(member); } @Test public void test() throws Exception { int threadCount = 10; ExecutorService executorService = Executors.newFixedThreadPool(threadCount); CountDownLatch latch = new CountDownLatch(threadCount); AtomicInteger failCount = new AtomicInteger(); AtomicInteger successCount = new AtomicInteger(); for (int i = 0; i < threadCount; i++) { executorService.submit( () -> { try { memberRepository.findById(member.getId()).get(); successCount.addAndGet(1); } catch (Exception e) { System.out.println(e.getMessage()); failCount.addAndGet(1); }finally { latch.countDown(); } } ); } latch.await(); assertThat(successCount.get()).isEqualTo(threadCount); assertThat(failCount.get()).isEqualTo(0); } }
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
트랜잭션 락 질문
jpa 트랜잭션 락 기능중에 낙관적 락과 비관적 락이 있는데실제로 이 락을 실무에서도 많이 사용하는지 궁금합니다.인터넷 예시로 게시글 조회수 카운트나 좋아요 카운트 관리 할 때 많이 사용한다고 하는데조회수나 좋아요 카운트는 카운트가 실시간으로 정확히 맞을 필요는 없는데 굳이 락을 이용해서 관리를 해야만 하는지 의문점이 들기도 합니다.실제로 실무에서 많이 사용한다면, 좀 더 실무에 와 닿을 수 있는 케이스를 알려주시면 감사하겠습니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
templates 하위에 css가 없어도 href="../css/bootstrap.min.css"가 적용되는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 위 사진처럼 templates 하위에 css 폴더나 css 파일이 없는 상태이고(css 파일은 /static/css/bootstrap.min.css에 있는 상태) templates/basic/items.html 코드에 <link href="../css/bootstrap.min.css" rel="stylesheet"> 이렇게 상대 경로로만 있는 상태에서 서버를 띄우고 http://localhost:8080/basic/items를 실행하면 css가 적용이 안 될 거라고 예상했습니다. 그런데 css가 적용이 됩니다. 위 상대 경로대로면 현재 위치의 상위로 간 다음에 css 경로를 찾아야 하는데 templates 하위엔 css가 없으므로 css 적용이 안 되어야 하지 않나요? 그런데 위 상대 경로로 static에 있는 css를 정상적으로 찾는 이유가 궁금합니다. 그냥 스프링 부트가 알아서 잘 찾아 주는 거라 보면 될까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
실행 버튼..!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]왼쪽에 실행하기 버튼이 안 뜹니다..ㅠㅠ 오른쪽 위 실행버튼을 누르면 전에 실행했던 것들이 실행되어서 의미가 없어요..
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링부트가 켜지질 않습니다...
스프링 JdbcTemplate강의까지 듣는 동안 스프링 부트가 잘 켜졌는데 갑자기 Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.2024-03-11T23:11:12.707+09:00 ERROR 3024 --- [ main] o.s.boot.SpringApplication : Application run failed 이러한 오류가 뜨면서 부트가 실행되었다가 죽어버립니다... run/edit Configurations까지 들어가봤는데 spring boot 옵션도 안보이고... 이상하네요 ㅠㅠ
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Whitelabel Error Page 질문
Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.Mon Mar 11 22:58:47 KST 2024There was an unexpected error (type=Internal Server Error, status=500).이런 오류가 뜨는데 전날은 인텔리제이에서 실행시키면 hello를 눌렀을 때 매핑을 통해서 hello페이지로 잘 이동했었고 cmd를 사용했을 때만 저 오류가 떴는데오늘 다시 실행해보니 인텔리제이 내부에서 실행시켜도 저 오류가 뜹니다.build.gradle인데 여기가 문제였을까요?plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') }
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
8:54 강의와 다른 오류가 발생했습니다!
8분 54초 강의와 마찬가지로 MemberServiceIntegrationTest 테스트 케이스를 실행하였는데 강의와 다른 오류가 발생하였습니다! 오류 내용 - 중복_회원_예외()java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@709ed6f3 testClass = com.namu.namuspring.service.MemberServiceIntegrationTest, locations = [], classes = [com.namu.namuspring.NamuSpringApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@485966cc, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7c711375, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6e0f5f7f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@1e1a0406, org.springframework.boot.test.context.SpringBootTestAnnotation@793bd5d3], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] 오류 내용 - 회원가입()java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@709ed6f3 testClass = com.namu.namuspring.service.MemberServiceIntegrationTest, locations = [], classes = [com.namu.namuspring.NamuSpringApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@485966cc, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7c711375, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6e0f5f7f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@1e1a0406, org.springframework.boot.test.context.SpringBootTestAnnotation@793bd5d3], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]
-
미해결스프링 핵심 원리 - 기본편
appConfig.xml
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.appConfig.xml 만들고 나서 에러가 뜨는데 어떻게 코드수정을 해줘야 할지 몰라 문의드립니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
java -jar 오류
빌드하고 실행하기 강의에서 java -jar hello-spring -0.0.1-SNAPSHOT.jar 를 실행하면 Error: Unable to access jarfile hello-spring이런 오류가 뜹니다. window cmd 창에서도 해보고 git bash 에서도 해보았는데 똑같은 오류가 떠요.. 무슨 문제일까요?
-
미해결스프링 핵심 원리 - 기본편
해당 프로젝트 clone하면, 자바 파일이 생성이 안돼요.
private으로 가끔 다른pc에서 git clone해서 해당 프로젝트를 다운받으면, 항상 자바 파일이 컵모양 => 으로 바뀌면서, 읽기만되고 자바 파일도 생성이 안되더라고요.. 구글링 해본결과 소스 루트를 지정하면 해결되는데, clone할때마다 해줘야하는게 좀 번거롭고 이상한 거 같아서, 근본적인 해결책이 궁금합니다..
-
해결됨토비의 스프링 부트 - 이해와 원리
자동구성 관련해서 질문드립니다.
안녕하세요 토비님.자동구성하는 방법에서 궁금한점이 있어 글드립니다.@MyAutoConfiguration 과 같이 imports 를 통해 자동구성을 설정해줄때 Configuration 외에 Service 혹은 Repository(JPA) 등 여러 다른 Component 들이 있을때는 어떤방식으로 자동구성을 해줄수 있을까요?단순히 생각했을때는 import 에 모두 기입하거나 @Import 의 방법이 생각이 들긴한데 너무 많은 정의가 있을경우에는 좋은방법이 있을까해서 질문드립니다.@ComponentScan 을 사용하는 방법은 권장하지 않는다고 들었습니다. (아마 스캔에 따른 불명확함 때문이 아닌가 생각합니다)
-
미해결스프링부트 시큐리티 & JWT 강의
섹션 3. JWT 관련 기능 질문입니다.
안녕하세요, 강의 잘 보고 있습니다.이번에 JWT 관련 기능을 구현함에 있어 참고차 보게되었는데요. 시큐리티가 인터페이스화가 많이 되어있다보니 동일한 기능임에도 구현하는 사람마다 어느 필터에서 인증/인가를 구현하는 지가 차이가 있는 것 같습니다. 섹션 3 버전2 소스 기준으로 JwtAuthorizationFilter 의 경우 BasicAuthenticationFilter를 확장하여 사용하고 JwtAuthenticationFilter의 경우 UsernamePasswordAuthenticationFilter 를 확장하여 사용하고, 필터에 등록되어 있습니다. 위 2가지 필터는 공식 문서 참고에 의하면BasicAuthenticationFilter 는 HTTP 헤더에서 토큰을 추출하여 간단히 인증을 하는 용도로, UsernamePasswordAuthenticationFilter는 폼 기반의 로그인을 처리한다고 나와 있습니다. 만약 그렇다면, 폼 로그인 없이 JWT 토큰 만으로는 BasicAuthenticationFilter를 확장하는 JwtAuthorizationFilter만 존재해도 인증 과정 상 크게 문제는 없어보이는데요.(권한 체크는 별도로 할거라 인증 과정에 넣지 않으려고 합니다.)어떤 분은 토큰 체크하는 부분을 GenericFilterBean 또는 OncePerRequestFilter 로 구현하시는 분들도 존재하더라구요.단순히 로그인 컨트롤러에서 JWT 토큰을 발급하고 이후 요청 필터에서 토큰 체크 및 리프레시 토큰 체크 등의 인증 처리를 한다면 어떤 필터를 구현하여 등록하는 걸 추천하시는지 개인적으로 궁금합니다.감사합니다.
-
미해결스프링 부트 - 핵심 원리와 활용
자동구성 관련 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 영한님.말씀해주신 자동 구성 라이브러리가 잘동작하는것 확인하였습니다.@Configuration 설정 항목들을 @AutoConfiguration 항목들로 구성하는 방법을 이해하고 문득 궁금한게 생겼는데요.내부에 @Service 관련이나 @Repository (JPA) 관련 컴포넌트들이있다면 이러한 여러 다른 컴포넌트들을 자동구성할수 있는 방법이 있을까요?@Import 로 전체 서비스를 일일히 해주는건 비효율적으로 보이는데 섹션 5.자동구성 정리의 8:43 초 부분에서 내부에서 @ComponentScan 을 사용하면 안되는 이유에 대해서 의견주시면 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 수정이 안되네요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]상품 수정하기 버튼누르면 아래와 같이 에러페이지로 연결됩니다.아이템컨트롤러는 아래와 같고 updateItemForm.html의 경로는 (\jpashop\src\main\resources\templates\items\updateItemForm.html)인데 왜 안되는걸까요?package jpabook.jpashop.controller; import jpabook.jpashop.domain.item.Book; import jpabook.jpashop.domain.item.Item; import jpabook.jpashop.service.ItemService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; @Controller @RequiredArgsConstructor public class ItemController { private final ItemService itemService; @GetMapping("/items/new") public String createForm(Model model) { model.addAttribute("form", new BookForm()); return "items/createItemForm"; } @PostMapping("/items/new") public String create(BookForm form) { Book book = new Book(); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity()); book.setAuthor(form.getAuthor()); book.setIsbn(form.getIsbn()); itemService.saveItem(book); return "redirect:/"; } @GetMapping("/items") public String list(Model model) { List<Item> items = itemService.findItems(); model.addAttribute("items", items); return "items/itemList"; } @GetMapping("/items/{itemId}/edit") public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) { Book item = (Book) itemService.findOne(itemId); BookForm form = new BookForm(); form.setId(item.getId()); form.setName(item.getName()); form.setPrice(item.getPrice()); form.setStockQuantity(item.getStockQuantity()); form.setAuthor(item.getAuthor()); form.setIsbn(item.getIsbn()); model.addAttribute("form", form); return "items/updateItemForm"; } @PostMapping("/items/{itemId}/edit") public String updateItem(@PathVariable Long itemId, @ModelAttribute("form") BookForm form) { itemService.updateItem(itemId, form.getName(), form.getPrice(), form.getStockQuantity()); return "redirect:/items"; } }
-
해결됨스프링 핵심 원리 - 기본편
멤버서비스 클래스 만드는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]현재 위와 같은 상황입니다. 왜 굳이 MemberService 인터페이스 및 클래스를 작성해야 하나요? 예를들어, MemberServiceTest 클래스에서다음과 같이 MemberService memberService = new MemberServiceImpl(); 대신 MemberRepository memberRepository=new MemoryMemberRepository(); 과 같이 하여도 되지 않나요? 굳이 MemberService 를 만드신 이유가 있을 것 같아 질문합니다.
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@Transactional 질문이 있습니다.
강의 중 트랜잭션 관련 부분을 보다 @Transactional과 직접 트랜잭션을 사용하는 예제를 떠올려 생각중인데 제가 생각한것이 맞는지 궁금하여 질문드립니다. @Transactional이 적용된 A클래스의 메서드에서@Transactional이 적용되지 않은 B클래스의 메서드를 호출하고B클래스 메서드의 내부는 직접 트랜잭션 매니져로 트랜잭션을 생성하고 롤백하는 로직이 포함되어 있는 상황이 있다고 가정한다면 트랜잭션 처리 순서는A클래스에서 트랜잭션이 시작되고 B클래스는 @Transactional이 없어서 트랜잭션AOP 프록시가 생성되지 않는것과는 상관없이 트랜잭션 매니져로 직접 생성한 트랜잭션으로 인해 A클래스의 트랜잭션에 합류하게 되어 B클래스의 롤백으로 인해 결과는 모두 롤백되는게 맞는걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계에 대해서 궁금한 점
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기서는 물리적으로, 논리적으로도 연관관계를 맺지만, 이렇게 물리적으로 연관관계를 맺을 시에 잘못하다 실수로 삭제를 했을 경우 발생하는 문제나, 속도적인 측면에서도 물리적으로 연관관계를 맺는 것은 좋지 않다(?) 라고 들은 적이 있습니다. 물론 연관관계를 직접 이렇게 맺는 것은 편하긴 하지만 실수로 발생하는 문제이나, 불 필요한 쿼리 문제(?) 를 해결하기 위해서 직접적인 연관관계를 맺지 않고 PK 값만 안 상태로 수동으로 다른 테이블 값을 찾는데, 그렇게 되면 굳이 불 필요한 쿼리문제도 해결이 가능하고, 실수로 삭제하는 것도 방지할 수 있어서 좋다고 생각을 합니다. 혹시 실무에서는 강의처럼 물리적, 논리적으로도 다 연관관계를 항상 맺는 건가요?