묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Do it! 알고리즘 코딩테스트 with JAVA
내림차순으로 정렬하기 강의에서..
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); int A[] = new int[str.length()]; for(int i=0; i<str.length(); i++){ A[i] = Integer.parseInt(str.substring(i, i+1)); } for(int i=0; i<str.length(); i++){ int Max = i; for(int j = i+1; j<str.length(); j++); { if(A[j]>A[Max]) { Max = j; } } if (A[i] < A[Max]){ int temp = A[i]; A[i] = A[Max]; A[Max] = temp; } } for (int i=0; i<str.length(); i++){ System.out.println(A[i]); } } } 안녕하세요 강의 잘 보고 있어요.강사님이 치라는 대로 코드를 따라 쳤는데 계속 오류가 뜨네요?? (굵게 표시한 부분)cannot find symbol 오류인데.. 분명 j와 max를 잘 정의해 주었는데 왜 이러는 걸까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블을 만드는 테스트가 계속 실패합니다.
Description:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver classAction:Consider the following:If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).이러한 오류만 반복이 되는데요 데이터 베이스 설정화면과application.yml 입니다 - Spring과 jpa가 동일한 선상에 있으면 안된다는 글도 읽게되어서 고쳤지만 같은 오류가 발생하였습니다...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: true logging.level: org.hibernate.SQL: debug org.hibernate.orm.jdbc.bind: trace맨처음에는 포트번호가 같아서 접속이 불가능 하다고하여 포트번호도 바꾸고 이것저것을 다 해봤는데 안돼어서 문의 남깁니다..ㅜㅜ 도와주세요ㅜㅜ
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
JDK 21버전 오류
자바 강의도중 JDK버전을 21을 사용하라고 하시더라고요.. 기존에 17버전을 사용을 했다가 21버전으로 사용을 한다고 해서 21버전으로 해보고 있는 도중에 Hello Java를 실행 시키니 에러가 뜨면서 도저히 해결이 안되고 있습니다 ㅠㅠ
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
ScannerWhile4 Switch문 질문
1. 위의 코드에서 case1 에 있는 변수 price를 case2에 사용하면 오류가 나는 이유가 무엇인가요? 오류가 나지 않게 switch문 밖에 price를 선언하면 어떻게 scanner을 사용해서 System.out.print("상품의 가격을 입력하세요: ");밑에 사용 하는 방법은 뭘까요??
-
해결됨실전! Querydsl
혹여 fetchOne() 메서드에서 예외가 발생하시는 분들을 위해서 작성합니다.
fetchOne()은 메서드 내부에서 JPQL의 getSingleResult를 수행하기에 현재 강의 환경에서 fetchOne()을 실행하면 NonUniqueResultException 예외가 발생합니다. 그 이유는 member1, 2, 3, 4 가 테스트 수행 전(@BeforeEach)에 persist 되기에 조회되는 member의 갯수가 4개가 됩니다. 그러므로 NonUniqueResultException 예외가 발생합니다. 참고하시면 좋을 것 같아서 남깁니다!
-
미해결김영한의 실전 자바 - 기본편
이런식으로 해도 객체 지향 프로그램인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.package oop1.ex; import java.util.Scanner; public class Account { Scanner scanner = new Scanner(System.in); int balance; int deposit() { System.out.print("입금할 금액을 입력하세요.\n↳ "); int depositAmount = scanner.nextInt(); balance += depositAmount; System.out.println("잔액: " + balance + "원"); return balance; } int withdraw() { System.out.print("출금할 금액을 입력하세요.\n↳ "); int withdrawAmount = scanner.nextInt(); if (balance > withdrawAmount) { balance -= withdrawAmount; } else { System.out.println("잔액이 부족합니다."); } System.out.println("잔액: " + balance + "원"); return balance; } void checkAmount() { System.out.println("잔액: " + balance); } } package oop1.ex; import java.util.Scanner; public class AccountMain { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Account account = new Account(); while (true) { System.out.println("-------------메뉴를 선택하세요-------------"); System.out.print("1. 입금 | 2. 출금 | 3. 잔액 확인 | 4. 종료\n↳ "); int selectMenu = scanner.nextInt(); switch (selectMenu) { case 1: account.deposit(); break; case 2: account.withdraw(); break; case 3: account.checkAmount(); break; case 4: System.out.println("프로그램을 종료합니다."); return; default: System.out.println("잘못된 입력입니다. 다시 입력해주세요"); break; } } } } 제 나름 입력까지 하는 프로그램으로 만들었는데 인스턴스 안에 메서드에 print를 넣는게 좋은지 메인 클래스에 print를 넣는게 좋은지 잘 모르겠습니다코드도 잘 짰는지 궁금합니다
-
미해결이펙티브 자바 완벽 공략 1부
강의 제목 오타 발견!!! 뚜둥
'아이템 10. 완벽 공략 25 - 리스코프 치환 원친' 이라고 되어있어요..!!
-
미해결스프링 시큐리티
ajax 구현 부분 작동이 안되서 질문드립니다.
ajax가 아예 진행이 안되서 질문드립니다. springSecurity6, 스프링부트 3.2.1 사용중입니다. 코드는 아래와 같은데 이게 어디서 어디가 틀렸는지를 도저히 모르겠습니다.ajax 전까지 form 방식은 정상적으로 작동하고 있으며,ajax 요청 보낼 시 POST http://localhost:8080/api/loginorg.apache.http.client.ClientProtocolException 이런 에러가 발생합니다. ajax.http 파일은 강의 문서를 다시 다운받아 했으며 postman으로 요청시 이유는 모르겠지만 get 요청으로 처리되고 위의 요청시 아래와 같은 로그 발생합니다 10000자 제한떄문에 댓글로 변경 curl 요청시 아래와 같습니다 10000자 제한떄문에 댓글로 변경 아래 코드에서 csrf disable을 하였음에도 계속 동일한 상태이고 강의 git 코드를 여러 브랜치에서 계속 참고해서 막 섞여있어서 어디서부터 고쳐야될지 전혀 모르겠습니다. 거의 6시간 넘게 헤매고 있는데 전혀 모르겠습니다. 혹시 확인 가능하시면 변경해야될 부분 부탁드립니다. 감사합니다. @Configuration @Slf4j @Order(0) public class AjaxSecurityConfig { @Autowired protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authenticationProvider); } @Qualifier("ajaxAuthenticationProvider") @Autowired private AuthenticationProvider authenticationProvider; // 변경된 부분 @Bean protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception { log.info("여기옴2"); http .authorizeHttpRequests(auth-> auth .requestMatchers("/api/login").permitAll() .anyRequest().authenticated() ); http.exceptionHandling(exceptionHandling -> exceptionHandling .authenticationEntryPoint(new AjaxLoginAuthenticationEntryPoint()) .accessDeniedHandler(ajaxAccessDeniedHandler()) ); http.addFilterBefore(ajaxLoginProcessingFilter(), UsernamePasswordAuthenticationFilter.class); http.csrf(csrf -> csrf.disable()); return http.build(); } @Autowired private ObjectMapper objectMapper; @Autowired private AuthenticationConfiguration authenticationConfiguration; @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { return authenticationConfiguration.getAuthenticationManager(); } @Bean public AuthenticationSuccessHandler ajaxAuthenticationSuccessHandler(){ return new AjaxAuthenticationSuccessHandler(); } @Bean public AuthenticationFailureHandler ajaxAuthenticationFailureHandler(){ return new AjaxAuthenticationFailureHandler(); } public AccessDeniedHandler ajaxAccessDeniedHandler() { return new AjaxAccessDeniedHandler(); } @Bean public AjaxLoginProcessingFilter ajaxLoginProcessingFilter() throws Exception { AjaxLoginProcessingFilter filter = new AjaxLoginProcessingFilter(); filter.setAuthenticationManager(authenticationManager(authenticationConfiguration)); filter.setAuthenticationSuccessHandler(ajaxAuthenticationSuccessHandler()); filter.setAuthenticationFailureHandler(ajaxAuthenticationFailureHandler()); return filter; } // @Bean // public AjaxLoginProcessingFilter ajaxLoginProcessingFilter(){ // AjaxLoginProcessingFilter ajaxLoginProcessingFilter = new AjaxLoginProcessingFilter(); // ajaxLoginProcessingFilter.setAuthenticationManager(authenticationManagerBean()); // return ajaxLoginProcessingFilter; // } } @Slf4j @Component public class AjaxAuthenticationProvider implements AuthenticationProvider { @Autowired private UserDetailsService userDetailsService; @Autowired private PasswordEncoder passwordEncoder; /** * 검증에 대한 구현 부분 * * 여기서 전달받는 authentication 객체는 AuthenticationManager에서 전달받는 것 * @param authentication the authentication request object. * @return * @throws AuthenticationException */ @Transactional @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String username = authentication.getName(); String password = (String) authentication.getCredentials(); log.info("ajax Authentication"+ authentication); log.info("ajax username : "+username); log.info("ajax password : "+password); /** * db에 있는 사용자를 가져오는 부분 */ AccountContext accountContext = (AccountContext)userDetailsService.loadUserByUsername(username); if (!passwordEncoder.matches(password, accountContext.getPassword())){ throw new BadCredentialsException("ajax invalid password!"); } /** * 섹션 4-8에서 secret key 추가해서 검증하는 부분 */ // FormWebAuthenticationDetails formWebAuthenticationDetails = (FormWebAuthenticationDetails) authentication.getDetails(); // String secretKey = formWebAuthenticationDetails.getSecretKey(); // // if (secretKey == null || !"secret123".equals(secretKey)){ // throw new InsufficientAuthenticationException("secret key invalid"); // } AjaxAuthenticationToken authenticationToken = new AjaxAuthenticationToken(accountContext.getAccount(),null,accountContext.getAuthorities()); // log.info(""+accountContext.getAccount()); // log.info(""+authenticationToken); return authenticationToken; } /** * parameter 로 전달되는 authentication 타입과 여기서 검증하려는 대상의 타입이 일치하면 검증하도록 하는거 * @param authentication * @return */ @Override public boolean supports(Class<?> authentication) { return authentication.equals(AjaxAuthenticationToken.class); } } public class AjaxAuthenticationToken extends AbstractAuthenticationToken { private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID; private final Object principal; private Object credentials; /** * 인증받기전에 사용자가 입력한 아이디와 비밀번호 담는 생성자 * */ public AjaxAuthenticationToken(Object principal, Object credentials) { super(null); this.principal = principal; this.credentials = credentials; setAuthenticated(false); } /** * 여기는 인증 완료후 아이디와 비번, 권한정보를 담는 생성자 */ public AjaxAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) { super(authorities); this.principal = principal; this.credentials = credentials; super.setAuthenticated(true); // must use super, as we override } public static UsernamePasswordAuthenticationToken unauthenticated(Object principal, Object credentials) { return new UsernamePasswordAuthenticationToken(principal, credentials); } public static UsernamePasswordAuthenticationToken authenticated(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) { return new UsernamePasswordAuthenticationToken(principal, credentials, authorities); } @Override public Object getCredentials() { return this.credentials; } @Override public Object getPrincipal() { return this.principal; } @Override public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { Assert.isTrue(!isAuthenticated, "Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead"); super.setAuthenticated(false); } @Override public void eraseCredentials() { super.eraseCredentials(); this.credentials = null; } } @Slf4j public class AjaxLoginProcessingFilter extends AbstractAuthenticationProcessingFilter { private ObjectMapper objectMapper = new ObjectMapper(); private static final String XML_HTTP_REQUEST = "XMLHttpRequest"; private static final String X_REQUESTED_WITH = "X-Requested-With"; public AjaxLoginProcessingFilter() { /** * 여기서 정한 경로의 요청만 받음 * 여기서 path 가 일치해야만 수행함 */ super(new AntPathRequestMatcher("/login", "POST")); } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException { log.info("isAjax processing"); if (isAjax(request)){ throw new IllegalStateException("Authentication is not supported"); } AccountDto accountDto = objectMapper.readValue(request.getReader(), AccountDto.class); /** * accountDto 비어있는지 확인하는 부분인데 StringUtils.isEmpty 가 deprecated 되어서 ObjectUtils.isEmpty 사용 */ if (ObjectUtils.isEmpty(accountDto.getUsername()) || ObjectUtils.isEmpty(accountDto.getPassword())){ throw new AuthenticationServiceException("Username op Password is empty"); } AjaxAuthenticationToken token = new AjaxAuthenticationToken(accountDto.getUsername(), accountDto.getPassword()); return this.getAuthenticationManager().authenticate(token); } /** * 클라이언트와 약속 정해서 * 그게 참이면 ajax 요청이 맞다고 판단함 * @param request * @return */ private boolean isAjax(HttpServletRequest request) { return "XMLHttpRequest".equals(request.getHeader("X-Requested-With")); } }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2.Driver 오류와 HelloProjectApplication 실행오류
[질문 내용]여기서 org.h2.Driver 인식이 안되는 문제가 발생합니다. 초록색으로 떠야하는 것 같은데 왜 인식이 안되는지 모르겠어요. build.gradle에도 dependencies에도 h2관련되어서 잘 추가했고 뒤에 띄어쓰기도 되어 있지 않습니다! 이 상태에서 HelloProjectApplication을 실행시켰더니 여러 오류들이 뜨는 것을 발견했습니다. com.zaxxer.hikari.pool.HikariPool j.LocalContainerEntityManagerFactoryBeano.s.boot.SpringApplication 이 3곳에서 에러가 발생합니다. 아래에 소스코드 파일 구글드라이브 첨부드립니다.. 감사합니다!https://drive.google.com/drive/folders/18tc10v1OtuO7iS6ZFTqcy0ag6eJH0NGU?usp=sharing
-
해결됨실전! 스프링 데이터 JPA
커스텀 인터페이스 구현체 이름 작성 시 순환 참조 발생 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 영한님. 이번 강의도 잘 수강한 학생입니다.강의 내용과 공식 문서를 참고하며 간단한 게시글 리포지토리를 만들어보고자, 아래처럼 작성했었습니다. public interface BoardRepository { Long save(final Board board); ... }@Repository @RequiredArgsConstructor public class BoardJpaRepositoryImpl implements BoardRepository { private final BoardJpaRepository boardJpaRepository; ... }public interface BoardJpaRepository extends JpaRepository<Board, Long> { }강의 내용대로 스프링 데이터 JPA인 BoardJpaRepository에 Impl을 붙인 BoardJpaRepositoryImpl을 만들었는데, 아래와 같이 순환 참조 문제가 발생했습니다. The dependencies of some of the beans in the application context form a cycle: boardController defined in file [/Users/hyunjoonchoi/Desktop/2024/2024-mju-mentoring/build/classes/java/main/com/mju/mentoring/board/controller/BoardController.class] ↓ boardService defined in file [/Users/hyunjoonchoi/Desktop/2024/2024-mju-mentoring/build/classes/java/main/com/mju/mentoring/board/service/BoardService.class] ┌─────┐ | boardJpaRepositoryImpl defined in file [/..../build/classes/java/main/com/mju/mentoring/board/infrastructure/BoardJpaRepositoryImpl.class] └─────┘ Action: Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true. 그런데 이름을 BoardRepositoryImpl, JpaBoardRepositoryImpl 등 다른 이름으로 하니까 순환 참조 문제가 해결되더라구요이에 대해서 다른 외국 개발자 분들도 이슈로 올리고, 그것들을 찾아봤으나 메인테이너 분이 @Lazy를 사용하거나 ObjectProvider를 사용해야 한다고 말씀해주시는 것 밖에 없었습니다. 공식 문서 (https://docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/repositories.html#repositories.create-instances)를 보면 스프링 데이터 JPA + Impl로 할 시 자동으로 스프링 데이터 JPA의 구현체로 인식한다고 되어 있는 것 같은데, 이런 순환 참조 이슈가 발생한 원인을 알 수 있을까요? 이를 해결해보고자 스프링 데이터 JPA 레포지토리에 직접 이슈로 남기고 (https://github.com/spring-projects/spring-data-jpa/issues/3320) 답변을 받았긴 했습니다만, 여전히 다른 이야기를 하시는 것 같아 영한 님께도 문의드리고 싶습니다!
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
매출액의 종류 문제에서 시간초과 에러가 뜨는데요...
public static void main(String[] args){ Scanner in = new Scanner(System.in); int a = in.nextInt(); int b = in.nextInt(); int[] arr = new int[a]; for(int i = 0 ; i < a ; i++) { arr[i] = in.nextInt(); } String answer = ""; HashMap<Integer, Integer> map = new HashMap<>(); for(int i = 0 ; i <= (a - b) ; i++) { map.clear(); for(int j = i ; j < (i+b) ; j++) { map.put(arr[j], map.getOrDefault(arr[j], 0) + 1); } answer = answer + map.size() + " "; } System.out.println(answer); }저는 이렇게 짰는데요...아무리 봐도 강의에서 알려주신 것과 크게 차이를 못 느끼겠는데... 혹시 어떤 부분에서 문제가 되는걸까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2 데이터베이스 연결 문제
[질문 내용]db 생성 확인하고 주신대로 입력하였는데 이런 오류가..ㅠ 도와주심 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
정적 생성 메서드 파라미터에는 DTO or Parameters ?
package jpabook.jpashop.domain.item; import jakarta.persistence.DiscriminatorValue; import jakarta.persistence.Entity; import jpabook.jpashop.controller.BookForm; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import static lombok.AccessLevel.PROTECTED; @Entity @DiscriminatorValue("B") @Getter @Setter @NoArgsConstructor(access = PROTECTED) public class Book extends Item { private String author; private String isbn; // public static Book createBook(String author, String isbn, String name, int price, int stockQuantity) { // Book book = new Book(); // book.setName(name); // book.setPrice(price); // book.setStockQuantity(stockQuantity); // book.setAuthor(author); // book.setIsbn(isbn); // // return book; // } public static Book createBook(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()); return book; } }이렇게 정적 생성 메서드의 파라미터를 Dto형태로 두는 것과 파라미터를 전부 명시적으로 적는 것 중에서 어떤 코드가 더 나은 코드일까요?createBook을 호출해서 사용할 때도, 인자 값을 Dto 하나만 넣어주면 되고, 실제 스펙은 BookForm에서 간단하게 확인 가능하다고 판단했습니다..!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Entity, dto관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의를 들으며 정리하는 중에 모르는 점이 생겨 질문을 남기게 되었습니다.필드변수가 똑같음에도 book클래스가 아닌 bookForm클래스로 매개변수를 가진다-> view 레이어와 db 레이어 사이의 역할을 분리하기 위해서bookForm이라는 dto를 매개변수로 사용하고entity는 사용하지 않는다. entity 객체에서 @setter를 사용한다.-> builder패턴을 사용할 수 있지만 예제라서 단순화 했고 실제 코드를 짤 때는 setter를 지양하는 것이 좋다(직접적으로 변경될 수 있기 때문에) setter가 꼭 필요한 상황에서는 사용해도 된다.-> 솔직히 어떤 상황에서 인지 잘 이해가 가지 않습니다.데이터 값을 하나하나 바꾸는 게 흔한 상황..? 이라던지 예시를 들어주실 수 있을까요? 각 제가 생각한 답변 보충해주고 싶으신 거나 틀린 부분이 있다면 수정 부탁드립니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메서드 작성 방법에 대해 제가 이해한 것이 맞는지 피드백 부탁드립니다.
<Member 클래스>package jpabook.jpashop.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") // 읽기 전용 private List<Order> orders = new ArrayList<>(); }<Order 클래스>package jpabook.jpashop.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; import java.util.List; import static jakarta.persistence.FetchType.*; @Entity @Table(name = "ORDERS") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "ORDER_ID") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "MEBMER_ID") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems; @OneToOne(fetch = LAZY ,cascade = CascadeType.ALL) @JoinColumn(name = "DELIVERY_ID", unique = true) private Delivery delivery; private LocalDateTime orderDate; // 주문시간 @Enumerated(EnumType.STRING) private OrderStatus status; //todo: 연관관계 메서드(양방향) public void setMember(Member member) { this.member = member; // Order -> member member.getOrders().add(this); // member -> order } }Order쪽에서 멤버와의 관계는 @ManyToOne이라 수정, 삭제가 가능해서 연관관계 메서드를 작성할 필요가 없지만, Member 쪽은 mappedBy로 매핑되어있기 때문에 Order를 참조할 때 읽기만 가능하다고 들었습니다. 따라서 Member쪽에서도 Order를 수정, 삭제를 하려면 값을 설정해야 하기 때문에 연관관계 메서드를 작성해야만 양방향 참조가 가능하다고 이해하였습니다.정리하자면, 다 관계는 연관관계 메서드를 작성할 필요가 없고, 일 관계에서만 연관관계 메서드를 작성해야 양방향 참조가 가능한 것이 맞나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 편의 메서드 작성 방법에 대해서 제가 이해한 것이 맞는지 피드백 부탁드립니다.
package jpabook.jpashop.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") // 읽기 전용 private List<Order> orders = new ArrayList<>(); }
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
31강 질문 있습니다.
책 대출기능 DB 테이블명을 'user_loan_hostory'라고 오타를 내서 생성을 하니까 책 대출 시 서버 내부 오류가 발생했습니다.그래서 테이블명을 'user_loan_history'로 수정한 후 대출 기능을 다시 실행해보니 잘 동작합니다. 왜 테이블명이 user_loan_hostory일 때는 인식하지 못하고, user_loan_history로 수정한 후에만 인식이 되는걸까요? db 테이블과 엔티티 객체를 매핑할 때, 대응되는 필드만 맞으면 DB 테이블명을 명시적으로 작성해주지 않아도 스프링이 알아서 인식하는 것이 아닌가요?ㅜㅜ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의 마지막, 생성된 SQL문을 그대로 쓰면 안된다고 하신 말의 의미
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]강의 마지막에 JPA가 생성해준 SQL문들이 콘솔에 쫙 찍히잖아요. 영한님께서 이걸 그대로 복사해서 쓰면 안되고, 고치고 수정해서 사용해야 한다고 하셨는데요. JPA가 이미 자동으로 DB에 테이블을 생성해준 것 아닌가요? 왜 또 create 쿼리를 쓸 일이 있다는듯이 말씀하시는건지 이해가 안갔습니다.JPA 기본편을 점프하고 바로 넘어와서 이해가 안가는건진 모르겠지만, JPA기술 자체가 자동으로 DB를 생성하고 관리해주는 것에 의의가 있는 것 아닌가요? 쿼리문 생성용으로 쓰는거라면 그냥 시중에 erd 그리는 GUI 툴들이 많은데 그걸 쓰면 되는 것이 아닌지.. 질문드립니다.
-
해결됨김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
ScannerWhileEx2 질문
package scanner.ex; import java.util.Scanner; public class ScannerWhileEx1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(true){ System.out.print("이름을 입력하세요 (종료를 입력하면 종료): "); String name = scanner.nextLine(); if(name.equals("종료")){ System.out.println("프로그램을 종료합니다."); break; } System.out.print("나이를 입력하세요: "); int age = scanner.nextInt(); scanner.nextLine(); //숫자 입력 후의 줄바꿈 처리 System.out.println("입력한 이름: " + name + ", 나이: " + age); } } }package scanner.ex; import java.util.Scanner; public class ScannerWhileEx2 { public static void main(String[] args) { Scanner input = new Scanner(System.in); while(true){ System.out.print("상품의 가격을 입력하세요 (-1을 입력하면 종료): "); int price = input.nextInt(); //input.nextLine(); if(price == -1){ System.out.println("프로그램을 종료합니다."); break; } System.out.print("구매하려는 수량을 입력하세요: "); int num = input.nextInt(); //input.nextLine(); System.out.println("총 비용: " + price * num); } } }ScannerWhileEx1에서는 숫자 입력 뒤 줄바꿈 처리를 해줘야한다고 배웠는데ScannerWhileEx2에서는 숫자 입력 뒤 줄바꿈 처리를 하지 않아도 오류가 안생깁니다.두 문제의 차이가 궁금합니다.문자열과 숫자가 입력될 때만 줄바꿈 처리를 해주는건가요?
-
미해결
JAVA Spring 환경설정
java spring 을 사용하려고합니다 근데 이때