묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
탬플릿 엔진을 사용할때는 DTO를 사용하지 않는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 엔티티를 api로 넘겨주면 엔티티가 수정됐을때 api가 오염될 수 있는 문제가 있어서 응답에 DTO를 보내준다고 이해했습니다.근데 이 문제는 탬플릿 엔진을 사용해 화면을 출력할때도 문제가 되지 않나요?1편에서 타임리프에 값을 넣을때는 DTO를 이용하지 않은 이유가 궁금합니다.혹시 컴파일 단계에서 오류가 나기 때문인가요?
-
미해결실전! 스프링 데이터 JPA
강사님 스프링 시큐리티,oauth관련
강의는 계획이 없으실까요..어떻게 공부해야할지 모르겠어요...
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
HelloSpringApplication 실행
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]어느 순간 갑자기 hello-spring 프로젝트를 켰을때 실행버튼이 안눌리고 HelloSpringApplication에서도 메서드에 재생 버튼이 안뜹니다. 왜그러죠? edit configuartion 해야하나요
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
실무에서 자바가 제공하는 락을 사용하는 경우
자바에서 제공하는 동기화 도구들(synchronized, ReentrantLock 등)은 단일 JVM 내에서만 동기화를 보장하고, 여러 인스턴스가 있는 분산환경에서는 분산락 등 다른 기법을 사용해야 하는 것으로 알고있습니다.현대의 운영 환경에서는 고가용성과 확장성을 위해 대부분 여러 인스턴스를 운영하기 때문에, 자바 자체의 동기화 기법을 사용하는 경우가 제한적일 것 같은데요. 실무에서 자바가 제공하는 동기화 도구들은 어떤 경우에 주로 활용되나요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
뮤텍스나 세마포어는 busy waiting이 없는 게 맞을까요?
강의자료에서 세마포의 경우 P연산에서첫째줄에 while(test_and_set(&lock)==1)을 수행하고 있는데요, 혹시 이부분은 busy waiting으로 생각하지 않는 건가요? 뮤텍스나 세마포어 모두 강의자료에서 위 코드를 처음 실행하는데 이부분도 busy waiting에서 while(); 문과 동일하지 않나 생각이 들어서요 혹시 제가 잘못 이해하고 있는 것이라면 알려주시면 감사하겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
port 안 죽는 문제
>java -jar jpashop-0.0.1-SNAPSHOT.jar 하는 단계에서 계속 오류가 납니다...Web server failed to start. Port 8080 was already in use. 라고요...8080포트가 사용중이라는데 cmd 관리자권한으로 실행해서 8080의 pid 는 찾아도 taskkill 이 안돼요이렇게 뜨고 인터넷창에서 8080 접속하면 static 폴더 안에 있는 파일인 이 페이지가 떠요.... 왜이럴까요? 계속 해도 안되네요....
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
스레드 질문 있습니다
안녕하십니까 영한님 영한님 덕분에 비전공자로서 백엔드 개발자의 꿈을 꾸고있는 사람중 1인입니다다름이 아니라 영한님께서 여러 스레드를 실행하면 main 스레드의 경우 다른 스레드의 종료까지 기다리지 않아 join이라는 메서드로 적절하게 대처하는 것이 중요하다고 들었습니다. 하지만 아래 코드를 보면 main 스레드가 종료라는 문구가 항상 맨 마지막에 나와 헷갈려서 여쭈어봅니다. 이경우도 main이 먼저 종료되어 thread가 실행되지 않을 수 있는 건가요? public static void main(String[] args) { MyTask task = new MyTask(); Thread thread = new Thread(task,"work"); log("runFlag = " + task.runFlag); thread.start();; sleep(1000); log("runFlag를 false로 변경 시도"); task.runFlag = false; log("runFlag = " + task.runFlag); log("main 종료"); } static class MyTask implements Runnable { volatile boolean runFlag=true; @Override public void run() { log("task 시작"); while (runFlag) { } log("task 종료"); } } }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
AOP @Component로 Bean 등록 처리할 경우에 관한 질문입니다.
https://www.inflearn.com/community/questions/48156/aop-timetraceaop-%EB%A5%BC-component-%EB%A1%9C-%EC%84%A0%EC%96%B8-vs-springconfig%EC%97%90-bean%EC%9C%BC%EB%A1%9C-%EB%93%B1%EB%A1%9D@Configuration 파일 내에서 @Bean 어노테이션을 사용하여 TimeTraceAop.java 파일을 빈으로 등록하는 경우, 참조 문제가 발생하는 부분에 대해 위 다른 분이 작성해주신 글을 통해 이해가 잘 갔는데요, 그럼 @Component 어노테이션을 활용하여 등록하는 경우에는 동일한 @Around 구문을 통해 명시된 @Around("execution(* hello.hellospring..*(..))")를 사용하는 경우 문제가 발생하지 않는 것인지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
단축키 작동 안됨
단축키 설정을 했는데 tdd 도 안되고 sout 도 안되는 이유는 무엇일까요? 참고로 build.gradle 파일은 아래와 같습니다plugins { id 'java' id 'org.springframework.boot' version '3.4.0' id 'io.spring.dependency-management' version '1.1.6' } group = 'jpabook' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } testImplementation 'junit:junit:4.13.2' } tasks.withType(Test) { useJUnitPlatform() }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
junit 안됨
https://drive.google.com/file/d/1M-NYH5etfTZPV5kMZzuiOWaBjA7bR3XR/view?usp=sharing위는 제 프로젝트 파일입니다 강의 파일에 나와있는부분을 복붙해도 오류나고testImplementation("junit:junit:4.13.2")이렇게 해도 오류납니다.Assert 부터 안되는데 뭐가 잘못된걸까요?
-
미해결Java 마이크로서비스(MSA) 프로젝트 실습
SpringCloud Gateway 연동
https://github.dev/ishrhrl39/3-3.Microservice강의중 유레카 대쉬보드에는 아이템 서비스가 잘 표현되는데 왜 postman 요청은 404가 뜨는지 원인을 못찾겠네요..라우팅쪽 문제인것같은데..
-
해결됨실전! 스프링 데이터 JPA
컬렉션 조회 관련
배운거를 적용하면서 쿼리 개선을 하고 있었는데, 혼자 해결해보려고 했으나 컬렉션 조회가 같이 섞이면서 이해가 잘 안 되는 것 같아 질문을 남기게 되었습니다.게시글 목록을 불러올때 태그이름 리스트를 같이 필요하기 때문에 관련 memePostTags와 Tag까지 같이 조회를 해야하는 상황입니다.테이블 관계가 MemePost 1 : N MemePostTag 1 : 1 Tag 이렇게 되어있을때getMemePost5 메서드와 getMemePost6메서드 둘 중에 어느 것이 더 나은 방법인지, 아니면 더 나은 다른 방법이 있는지 궁금합니다.getMemePost5의 경우는 MemePostTagRepository에서 Tag까지 fetch join으로 불러오고, Map 객체에 postId를 key로 저장해서 태그 이름을 조회합니다.getMemePost6의 경우는 페이징으로 조회한 후 postIds를 in절로 postTag와 tag를 fetch join합니다. 컬렉션 조회의 경우 페이징을 안할 경우 fetch join으로, 페이징을 할 경우 batch size로 하라는 것까지는 이해가 되었는데, 이 경우에는 postTags를 batch size로 가져오고, 그에 다한 tag도 batchsize로 가져와 추가로 두번의 쿼리가 더 나가게 되어서 다른 방법을 고안해내다가 점점 미궁으로 빠지는 것 같아서 질문을 남기게 되었습니다 😂 public Slice<MemePostSummaryResponse> getMemePosts5(int page, int size, MemePostSort postSort, Long userId) { Pageable pageable = PageRequest.of(page, size, postSort.toSort()); Slice<MemePost> memePostSlice = memePostRepository.findSliceAll(pageable); List<Long> postIds = getPostIds(memePostSlice.getContent()); // MemePostTag와 Tag를 한번에 fetch join 하나의 쿼리로 하되, MemePostTagRepository에서 entitygraph를 통해 fetch join Map<Long, List<String>> postTagNames = memePostTagRepository.findTagsByMemePostIdIn(postIds) .stream() .collect(groupingBy(tag -> tag.getMemePost().getId(), mapping(tag -> tag.getTag().getName(), toList()))); //좋아요도 하나의 쿼리로 Set<Long> likedPostIds = new HashSet<>(memePostRepository.findLikedPostIds(postIds, user)); List<MemePostSummaryResponse> responses = memePostSlice.getContent().stream() .map(mp -> new MemePostSummaryResponse( mp, likedPostIds.contains(mp.getId()), postTagNames.getOrDefault(mp.getId(), Collections.emptyList()) )) .toList(); return new SliceImpl<>(responses, pageable, memePostSlice.hasNext()); } public Slice<MemePostSummaryResponse> getMemePosts6(int page, int size, MemePostSort postSort, Long userId) { Pageable pageable = PageRequest.of(page, size, postSort.toSort()); Slice<MemePost> memePostSlice = memePostRepository.findSliceAll(pageable); List<Long> postIds = getPostIds(memePostSlice.getContent()); // MemePostTag와 Tag를 한번에 fetch join memePostRepository.findAllWithTagsInPostIds(postIds); //좋아요도 하나의 쿼리로 Set<Long> likedPostIds = new HashSet<>(memePostRepository.findLikedPostIds(postIds, user)); List<MemePostSummaryResponse> responses = memePostSlice.getContent().stream() .map(mp -> new MemePostSummaryResponse( mp, likedPostIds.contains(mp.getId()), mp.getTagNames() )) .toList(); return new SliceImpl<>(responses, pageable, memePostSlice.hasNext()); } public interface MemePostRepository extends JpaRepository<MemePost, Long>, MemePostRepositoryCustom { @Query("SELECT mp FROM MemePost mp where mp.deletedAt IS NULL") Slice<MemePost> findSliceAll(Pageable pageable); @Query("SELECT mp.id FROM MemePost mp " + "JOIN MemePostLike mpl ON mpl.memePost = mp " + "WHERE mp.id IN :postIds AND mpl.user = :user") List<Long> findLikedPostIds(@Param("postIds") List<Long> postIds, @Param("user") User user); @Query("SELECT mp FROM MemePost mp " + "LEFT JOIN FETCH mp.memePostTags mpt " + "LEFT JOIN FETCH mpt.tag " + "WHERE mp.id In :postIds") List<MemePost> findAllWithTagsInPostIds(@Param("postIds") List<Long> postIds); } public interface MemePostTagRepository extends JpaRepository<MemePostTag, Long> { @EntityGraph(attributePaths = {"tag"}) List<MemePostTag> findAllByMemePostId(Long postId); @EntityGraph(attributePaths = {"tag"}) List<MemePostTag> findTagsByMemePostIdIn(List<Long> memePostIds); } public class MemePost { public List<String> getTagNames() { return memePostTags.stream() .map(mpt -> mpt.getTag().getName()) .toList(); } }
-
미해결실전! Querydsl
Querydsl 취약점 관련 질문입니다.
안녕하세요. 최근 querydsl 공부를 시작하려고 정보를 찾던 중 querydsl에 대한 SQL Injection 에 관한 내용을 보고 김영한님의 생각이 궁금합니다!그리고 querydsl 지원중단 얘기를 보기도 해서 이런 취약점이 나올 때마다 빠른 대응이 되는지 역시 궁금합니다!! https://www.csirt.sk/querydsl-java-library-vulnerability-permits-sql-hql-injection.html
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
조금 더 깊은 내용, 실무적인 내용, 미래의 계획에 대해서 궁금합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]영한님 강의 잘 듣고 있습니다!!지금 강의도 정말정말 좋고 많은 것을 다루지만, 이런 것들을 다룰 예정은 없는지 여쭤보고 싶습니다!Lock next level(자바)ReadWriteLock, StampedLock, Mutex, Semaphore비동기/멀티스레드 next level(feat. 스프링)CountDownLatch 사용법, Transaction 동시성 테스트, 멀티스레드를 활용한 성능/부하 테스트 방법 항상 잘 배우고 있습니다 감사합니다 ☺
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
N:1 관계에서 delete 질문있습니다.
@Entity @Builder @NoArgsConstructor @AllArgsConstructor @Getter @Setter public class Member { @Id @GeneratedValue private Long id; @Column private String username; @ManyToOne @JoinColumn(name = "team_id") private Team team; } @Entity @Builder @NoArgsConstructor @AllArgsConstructor @Getter @Setter public class Team { @Id @GeneratedValue private Long id; private String name; } try { tx.begin(); Team team = new Team().builder() .name("teamA") .build(); em.persist(team); Member member = new Member().builder() .username("member1") .team(team) .build(); em.persist(member); em.flush(); em.clear(); Member findMember = em.find(Member.class, member.getId()); Team findTeam = findMember.getTeam(); em.remove(findTeam); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); }findTeam을 remove하기 전에 findMember.setTeam(null) 이런 식으로 팀과의 연관 관계를 null로 만들고 삭제하지 않았는데 에러가 발생하지 않고, 데이터베이스에서 member 정보와 team 정보 모두 삭제됩니다. CASCADE 설정이 되어 있는 건 아닌데 왜 이렇게 동작하는 걸까요??
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
자바 초보의 질문입니다
if문 관련 질문입니다.조건에 따라 dollar <0 일 경우 "잘못된 코드입니다dollar == 0 일 경우 "환전할 금액이 없습니다dollar >0 일 경우 dollar = dollar*1300을 출력하고 싶습니다 그런데 위와 같이 코드를 작성하였을 때 dollar가 0 이하가 될 경우 if (dollar<0)문과 else문이 함께 실행됩니다.왜 이러는 걸까요? 저는 if 문이 실행되면 else문은 실행이 되지 않는다고 이해했는데 혹시 다른 이유가 있는 걸까요?답을 알고 계시는 분은 상세하게 설명 부탁드립니다ㅠㅠ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
프로젝트 생성시 dependencies에 spring web starter 안뜸
dependencies에 spring web strater 검색해도 안뜨는데 어떡해야하나요??
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
숫자와 문자의 2진수 숫자가 동일할 경우 타입에 대한 메타정보는 어디에 있나요
Java는 해당 강의만 구매 해서 앞의 강의 내용에 있을지 모르겠습니다만 헷갈리는 부분이 있습니다. 숫자와 문자의 2진수 표현은 같고데이터타입이 숫자 타입인지 문자 타입인지 나타내는 byte 도 있을 것 같은데 이걸 어떻게 구분하는지 구글링에서 검색할 수 있는 키워드나 답을 알려주실 수 있으실까요 숫자 65의 2진수 표현: 1000001문자 'A'의 2진수 표현: 1000001 강의 내용에 java의 경우 1byte의 prefix를 통해 음수를 표현할 수 있다고 하셨는데 데이터 타입은 어디에서 관리되는지 궁금하네요. 저장되는 메모리 구역이 다른지..그렇다 해도 할당된 데이터 구조 내에 있어야 할 것 같은데 진짜 궁금하네요 클로드에선 아래와 같이 답을 줬는데요각 데이터 타입은 1바이트부터 8바이트까지 고유한 메모리 할당 방식을 가지고 있어, 메모리 내 위치와 크기로 타입을 구분할 수 있습니다. 그럼 각 데이터에 대한 메모리 위치는 stack 에서 가지고 있지 않나 싶은데 stack 에서도 해당 데이터 타입이 byte 인지 아니면 텍스트인지 어떻게 알고 있는지 다시 궁금하네요. -ㅂ- stack을 공부하면 되겠네요... 문자인코딩 섹션이 단순한 내용 같아도 진짜 생각 많이 하게 되는 강의네요.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Tomcat
[질문 내용]안녕하세요,강의 중에 궁금한점이 있어 글 남깁니다. 스프링 부트 스타터에 톰캣이 인베디드 되어서 저절로 가져오기 때문에 서버에 따로 톰캣을 설치할 필요가 없다고 하셨는데,그렇다면 각 프로젝트를 서버에 띄우게 되면 모두 톰캣이 멀티 인스턴스로 띄우고 각 프로젝트는 모두 다른 포트를 사용해야하는걸까요? 만약 그렇다면 각 프로젝트에 톰캣 포트 세팅을 따로 해주어야하는데 해당 부분은 서버에서 하는게 아닌 프로젝트를 배포할때 세팅 파일에 따라 세팅이 되는 걸까요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
오류?
Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] Database driver: undefined/unknown Database version: 8.3 Autocommit mode: undefined/unknown Isolation level: undefined/unknown Minimum pool size: undefined/unknown Maximum pool size: undefined/unknown실행과 테이블 다 잘 만들어 지는데 이런 로그가 계속 뜹니다.제 mysql 문제일까요?mac os 사용중이고 강의처럼 docker를 통해 띄우는게 아닌 홈브류로 mysql을 다운받아서 쓰고있었어서 그대로 쓰는중입니다