묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Service에서 @transactional을 왜쓰는건가요? 안써도 되지않나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]트랜젝션을 쓰지 않아도 크게 상관이없지않을까요?왜쓰는건지 궁금하고트랜젝션을 쓰지않을때는 도메일 모델 패턴으로쓰는데도메일 모델 패턴은 왜 트렌젝션을 어노테이션으로 달지않나요?야생형으로 듣다보니 의문형이 생기네요
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
생성 메서드 질문! Static을 왜 붙이는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]생성메서드의 용도가 갑자기 까먹었는데그냥 생성자로 넣어주려는걸로 아는데Static으로 정적으로 왜쓰는건가요?Static 빼면 안되나요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
급 @Repositroy 질문
@Repository가 Data Access layer 계층에 있고 선언만하면 Bean으로 등록이되서 spring container가 관리해주는것으로 알고있습니다. 여기서 질문인게 DB-1편 자료를 읽고와보니 PlatformTransactionManager를 썼을때 코드상에 @Repositroy를 안붙이셨는데 굳이 @Respository를 붙이지 않아도 되나요?저는 꼭 붙여야만 저장소로 인식이 되는줄알아서요 정확한답변 부탁드립니다@Slf4j public class MemberRepositoryV1 { private final DataSource dataSource; public MemberRepositoryV1(DataSource dataSource) { this.dataSource = dataSource; } public Member save(Member member) throws SQLException { String sql = "insert into member(member_id, money) values (?, ?)"; Connection con = null; PreparedStatement pstmt = null; 코드는 일부만 발췌했습니다! 지금 MemberRepository1~4까지 확인해보니 위에 전부다 @Repository를 붙이시지 않았더라구요!제가 잘 알지못해서 정확하게 답변듣고싶습니다
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
Section 8 소셜 로그인 API 서버 인코딩 관련 문의드립니다.
위 코드는 수업중 진행하신 MemberServiceImpl.java 파일의 getEmailFromKakaoAccessToken 메소드의 일부입니다. 저기에서 마지막에 bodyMap 을 로그로 확인하는 부분이 있는데 위와 같이 nickname 을 보면 인코딩이 깨져서 나옵니다.저 nickname 을 확인하려면 어떻게 해야하나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
자바파일생성안됨
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.저 빨간색 폴더안에서는 자바파일이 생성이 안되는데 똑같이 디렉토리를 생성하면 가끔 저렇게 빨갛게 뜨면서 자바파일이 안만들어지는데 원인이 무엇인가요??해결방법도 알려주세요!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
강의 1:40 코드 질문
해당 코드의 빨간 줄이 생기는데 왜 그럴까요?실행 결과는 잘 나옵니다. Unchecked assignment: 'java.util.List' to 'java.util.List<java.lang.Object[]>'
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
Spring과 MySQL연동 실패 ..
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' runtimeOnly 'com.h2database:h2' runtimeOnly 'mysql:mysql-connector-java:8.3.0' testImplementation 'org.springframework.boot:spring-boot-starter-test'}위와 같이 dependencies를 설정했고 밑은 application.yml입니다. spring: datasource: url: "jdbc:mysql://loca lhost/library" username: "root" password: "비밀번호" driver-class-name: com.mysql.cj.jdbc.Driver비밀번호는 알아서 설정했습니다. 오류가 생겨서 dependencies에서 runtimeOnly 'mysql:mysql-connector-java:8.3.0'로 설정했습니다.밑에는 에러 표시입니다. Execution failed for task ':LibraryAppApplication.main()'.> Could not resolve all files for configuration ':runtimeClasspath'. > Could not find mysql:mysql-connector-java:8.3.0. Required by: project :Possible solution: - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html > Task :LibraryAppApplication.main() FAILEDExecution optimizations have been disabled for task ':LibraryAppApplication.main()' to ensure correctness due to the following reasons: - Type 'org.gradle.api.tasks.JavaExec' property 'classpath' cannot be resolved: Could not resolve all files for configuration ':runtimeClasspath'. Reason: An input file collection couldn't be resolved, making it impossible to determine task inputs. Please refer to https://docs.gradle.org/7.5/userguide/validation_problems.html#unresolvable_input for more details about this problem.Execution failed for task ':LibraryAppApplication.main()'.> Could not resolve all files for configuration ':runtimeClasspath'. > Could not find mysql:mysql-connector-java:8.3.0. Required by: project :Possible solution: - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html Could not find mysql:mysql-connector-java:8.3.0.Required by: project :Search in build.gradle files뭐가 에러인가요..? 만약 Runtimeonly뒤에 version을 따로 기입하지 않는다면, Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure라는 에러가 뜹니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
PK값으로 테스트 할 때 질문입니다.
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 우선, 덕분에 테스트 코드를 작성하는데 많은 도움이 됐습니다! 현재 토이프로젝트 진행 중에 PK 값을 Long 타입으로 두고 @GeneratedValue(strategy = GenerationType.IDENTITY) 이 전략을 사용하니, tearDown을 해도, 전체 테스트에서는 create하고 삭제를 하니, PK인 Long이 1L인 것을 보장을 못하더라구요.그래서 create하는 메서드의 반환을 void로 했다가 Long 타입으로 반환하는데, 이렇게 하는 것도 좋은 코드인가요..?@DisplayName("사용자를 조회하면 사용자의 이름, 직업, 전화번호, 성별을 조회한다.") @Test void getUserInfo() { //given Register register = Register.builder() .name("name") .job(Jobs.STUDENT) .phone("010-0000-0000") .man(true) .build(); Long id = usersService.registerUser(register); //when UserResponse userInfo = usersService.getUserInfo(id); // then assertThat(userInfo.name()).isEqualTo("name"); assertThat(userInfo.job()).isEqualTo(Jobs.STUDENT); assertThat(userInfo.phone()).isEqualTo("010-0000-0000"); assertThat(userInfo.man()).isEqualTo(true); } // 단건 조회 public UserResponse getUserInfo (Long id){ Users user = usersRepository.findById(id). orElseThrow(IllegalArgumentException::new); return UserResponse.of(user); } 입니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO 선언할 때 @AllArgsConstructor 붙여준 이유
DTO 선언 시 @AllArgsConstructor를 붙여주셨는데 그 이유가 궁금합니다.Jackson 라이브러리가 정상적으로 JSON 데이터를 객체에 바인딩 해주기 위해 모든 인스턴스 변수를 포함한 생성자가 필요해서 그런 것인가요?혹은 단순히 컨트롤러 메서드에서 DTO 데이터를 전체적으로 초기화하기 위함인가요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
프록시 내부 호출 문제에 관한 질문 사항
보통 실무에서는controller ->service(interface) -> repository -> dao^|serviceImpl (service Interface 구현체)이렇게 많이 사용합니다. 제가 개발자로 실무를 하지 않아서 정확하지는 않지만@Configuratiain 을 이용한 클래스에서 구성을 잡고 포인트컷으로 지정된 패키지와 그 하위 *Impl 메서드에 모든 @Transaction 어노테이션이 적용되도록 설정을 했던 것 같습니다.그리고 serviceImpl에서 @Transactional 어노테이션을 사용하지 말라고 가이드가 내려 옵니다. 코딩은public class serviceImpl {public int createMember(MemberVO member) {deleteMember(member);insertMember(member);updateMember(member);} public int deleteMember(MemberVO member) {//비지니스 로직 수행String id = member.getId(); //null 체크 되어 있다고 가정repository.delete(id);}public int insertMember(MemberVO member) {//비지니스 로직 수행repository.insert(member);} public int updateMember(MemberVO member) {//비지니스 로직 수행repository.update(member);}} 그런데 한번도 아키텍처나 업무 공통 단에서 내부 호출에 대한 가이드가 없었습니다.그리고 실제로 내부 호출을 해도 Transaction 처리에 문제가 있지는 않았습니다.그렇다고 AspectJ 의 컴파일러를 이용하는 것 같지도 않고ObjectProvider를 사용하는 것 같지도 않는데 말입니다. 고급편에서도 궁금했지만 DB2편을 다 수강하고 나서 질문을 드립니다 아키텍처 쪽에서 내부 호출에 대한 문제를 모르진 않았을것 같은데통상적으로 어떻게 @Transactional 처리를 하기에 개발자들은 내부 호출 문제에 신경 쓰지 않을까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
build.gradle에러
[질문 내용] ext["hibernate.version"] = "5.6.5.Final" 를 못 읽는것같습니다 뭐가 문제일까요 ??
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
재질문드립니다.(해결했습니다.)
무료버전 인텔리j라서 강사님처럼 sql문이 나오지않아서 확인은 못하나터미널에서 mysql확인 결과 테이블은 잘 생성되었습니다.//해결했습니다. 23/03/25 16:54기본생성자를 안해서 생긴 문제였고 에러코드에서 인지는 하고있었는데 최초 해결시 접근제어자 public과 void를 사용해버려서 기본생성자로 인식을 못했던것같습니다. 같은 증상있으신분들은 참고해주세요
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
querydsl
[질문 내용]안녕하세요 자바 17에 스프링 3이상으로 실습해보고있습니다.처음엔 의존관계 설정을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" 이렇게 해줬는데 clean만 빌드가 되며 compileJava가 빌드가 안되고 그래들에서 의존관계에 빨간불이 뜨며 persistence를 찾을 수 없다는 에러 메세지가 나왔습니다찾아보던 도중 persistence버전을 3.0.1로 높이면 해결이 된다라는 글을 보고 버전을 올려줬습니다. 그 후 빌드를 해줬더니 jakarta로 import해주었던게 다 javax로 바뀌어있더라고요 그래서 일일히 들어가 다시 jakarta로 바꿔주니까 clean과 compileJava 둘 다 정상적으로 빌드되었습니다.하지만 그래들은 저렇게 아직 빨간불이 뜹니다 이대로 진행해도 되는걸까요 ? 왜 persistance 버전을 높이면 javax로 돌아가는건가요 ?
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
spring Legacy Project에서 MVC 프로젝트가 없습니다. 어떻게 해야하나요?
안녕하세요. 24.03.24일 날 스프2탄을 구매하였습니다. 시작부터 문제가 발생되어서 글 남깁니다. 강사님의 영상을 따라 eGovFrame-4.0.0을 다운로드 하였고 1. 프로젝트를 생성하기위해 Spring Legacy Project 클릭 ---문제 발생 ---- 2.Simple Projects만 보이고 MVC프로젝트가 보이질 않습니다. 구글링을 해보고 시도 하였지만 해결되지 못했습니다. 초보의 입장에서 난감해하고 있습니다. 해결방법과 그따른 영상을 업데이트를 해주실수 있을까요?
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
하위 패키지의 상위 패키지 참조
안녕하세요 강의 잘 듣고있습니다.1분 42초쯤에 말씀하신 치명적인 실수에 대해서 질문드립니다. 강의에서는 후반부에 CertificationService가 자연스럽게 사라짐에 따라 하위 패키지인 UserServiceImpl이 상위 패키지인 CertificationService를 참조하지 않게 변경됐지만, 만약 CertificationService이 계속 존재했다면 UserServiceImpl은 어떠한 형태로 올바르게 CertificationService을 참조할 수 있을까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
dto 위치
만약 규모가 작은 프로젝트인 경우 현업에서 controller, service, vo 이런식으로 구조를 나누고 그 안에 비지니스 로직기준해서 폴더를 나누어 주는 경우도 있는데, 그 경우에는 말씀하셨던 비지니스따라 class파일을 만드는것과 크게 구조적으로 차이가 클까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
AddressEntity 사용이유
값 타입인 Address를 감싸고 있는 AddressEntity를 따로 만들어서 일대다에서 다의 역할을 해주고 있는데 이렇게 하지 말고Address자체를 @Entity로 만들어서 일대다에서 "다"의 역할을 하게 해도 되지 않나요? AddressEntity를 쓰는 이유가 무엇인가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
update 쿼리 질문
package hellojpa; import jakarta.persistence.*; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); //code EntityTransaction tx = em.getTransaction(); tx.begin(); try { Member member = new Member(); member.setUsername("member1"); member.setHomeAddress(new Address("homeCity", "street", "1000")); member.getFavoritesFoods().add("치킨"); member.getFavoritesFoods().add("족발"); member.getFavoritesFoods().add("피자"); member.getAddressHistory().add(new Address("old1", "street1", "10001")); member.getAddressHistory().add(new Address("old2", "street2", "10002")); em.persist(member); em.flush(); em.clear(); System.out.println("============="); Member findMember = em.find(Member.class, member.getId()); Address a = findMember.getHomeAddress(); findMember.setHomeAddress(new Address("city", a.getStreet(), a.getZipcode())); findMember.getFavoritesFoods().remove("치킨"); findMember.getFavoritesFoods().add("한식"); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } private static Member saveMember(EntityManager em) { Member member = new Member(); member.setUsername("member1"); em.persist(member); return member; } } 이 때 member.getAddressHistory().add(new Address("old1", "street1", "10001")); 위 코드는 update문이 나갑니다. 그 이유는 알고 있는데 findMember.getFavoritesFoods().add("한식"); 이 코드는 update가 아니라 insert문이 나가더라고요. 왜 update가 아니라 insert문이 나가는 건가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
@RequestBody 사용 이유
ADD API 에서는 "@Request Param" 을 DTO 타입(CalculatorAddRequest request)으로 인자를 받으며 생략했는데 @RequestBody 는 DTO 타입으로 인자를 받았음에도 생략하지 않은 이유가 궁금합니다.DTO 타입을 사용하는것이 쿼리에 있는 name 과 DTO 의 변수명이 동일한 것을 자동으로 매칭시켜 주는 것이라면왜 BODY 에 있는 변수명과 DTO 의 변수명이 동일할 때는 @RequestBody 없이 매칭되지 않는지요...!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Transactional AOP 구현 질문
안녕하세요 영한님,@Transactional을 썻을때 스프링에서 구현해주는 AOP Proxy의 rollback시 동작순서에 궁금한점이 있어 질문드립니다. @Transactional 애노테이션이 붙은 method에서 예외가 발생해서 proxy구현체에서 롤백할시에 transaction 롤백 요청후 catch한 exception을 다시 던져주나요? 물론 AOP 구현체는 아래보다 복잡하겠지만, 아래와 비슷하게 동작하는지 궁금합니다.public Object implementTransactionalAOP(ProceedingJoinPoint pjp){ TransactionStatus tx = txManager.getTransaction(new DefaultTransactionAttribute()); try { Object ret = pjp.proceed(); txManager.commit(tx); return ret; }catch (RuntimeException e){ txManager.rollback(tx); throw new RuntimeException("",e); } }제가 괜히 코드를 집어넣어서 헷갈리게 해드리는것 같지만, 질문의 요점은 예외가 터졌을때 rollback만 요청해주는지 아니면 예외를 잡아서 같은예외를 다시 던져주는지가 궁금합니다.