묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
사소한것같지만 질문 ..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.@Override public Member save(Member member) { String sql = "insert into member(member_id, money) values(?,?)"; template.update(sql,member.getMemberId(),member.getMoney()); return member; }@Override public void update(String memberId, int money){ String sql = "update member set money = ? where member_id=?"; template.update(sql, money, memberId); }위에 2개가 강의 내용인데, update()도 초반 코드설계를 @Override public Member findById(Member member){ String sql = "select * from member where member_id = ?"; return template.queryForObject(sql,memberRowMapper(),member.getMemberId()); }이런식으로 Member를 받아와서 설계하는건 좋지않은방법인가요 ? 어차피 필요한건 member 객체 전체가 아니라 member_id하나만 필요하기때문에 ? 강의를 들을때는 이런식으로 설계하면 되는구나 하고 이해는 가는데 혼자서 메서드 설계할때 어떤식으로 접근해서 설계하는게 이상적인지 아직 어렵네요
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
같은 세션을 사용하기 위해서 동일한 커넥션을 사용한다고 했는데
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]그러면 영한님이 h2데이터베이스로 트랜잭션 설명하실 때 창을 2개 띄워놓고 하셨잖아요 그 때도 2개의 창이 같은 세션을 사용하고 있는건가요?
-
해결됨토비의 스프링 부트 - 이해와 원리
application.properties파일내 프로퍼티 이름
안녕하세요.다시 스프링부트의 자동 구성으로 전환하는 강의에서application.properties에 server.~ 과 data.~ 로 정의했던 것들을 아래 코드와 같이 스프링의 자동구성에서 사용하는 프로터피 이름으로 변경하라고 하셨습니다.spring.servlet.context-path=/app spring.servlet.port=9090 spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem: spring.datasource.username=sa spring.datasource.password=근데 위와같이 변경하지 않아도 아래 자동주입 및 @PostConstruct가 문제없이 동작되듯 실행이 잘 됩니다..@SpringBootApplication public class HellobootApplication { JdbcTemplate jdbcTemplate; public HellobootApplication(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @PostConstruct void init() { jdbcTemplate.execute("create table if not exists hello(name varchar(50) primary key, count int)"); } public static void main(String[] args) { SpringApplication.run(HellobootApplication.class, args); }직접만든 자동구성클래스를 삭제했으니 datasource나 JdbcTemplate또한 spring의 자동구성이 필요할텐데, 실행로그를 보면 기존 datasource정보를 읽어서 동작하더라구요. 왜 그런걸까요?
-
미해결토비의 스프링 부트 - 이해와 원리
강의 공부방법
안녕하세요 현재 자바를 공부하고 있습니다. 곧 스프링 부트 공부를 시작할 것 같은데 처음 배운 언어가 Python이라 Django정도만 다뤄봤습니다. 워낙 유명한 강의기에 퀄리티나 내용은 의심치 않지만 입문한지 얼마 안된 사람도 이해하기 쉬운 난이도인지 궁금합니다. "이 강의는 코드를 잘 짜는 법을 가르쳐주는 강의가 아닌 더 나은 개발자가 되는 방법을 가르쳐 주는 강의입니다." 그리고 저도 강의를 다 듣고나서 저런 감정을 느끼고 싶습니다! 저렇게 하려면 스프링 부트를 공부할 때 어떻게 공부를 해야하는지 궁금합니다!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
예외 처리 부분에 대해서 질문드립니다
안녕하세요. 좋은 강의 잘 듣고 있습니다.다름이 아니라 예외처리에 대해서 질문드립니다.MemberService2 코드를 보면 예외를 처리하는 부분에 있어서 ,try~catch로 예외를 처리하는데 catch에는 단순히 로그만 찍거나 try~catch로 예외를 처리하는데 catch에서 throw로 예외를 발생시키고,어떤부분은 단순히 throws로 예외를 넘기는데, 어떤기준에 의해서 이렇게 하셨는지 궁금합니다.. 혹시 강의 뒤편에 있는 예외처리부분을 학습하면 해결이 되는 부분일까요..? 트랜잭션에 관련된 부분은 이해가 되었는데 이 부분이 애매해서 질문드립니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
DeferredImportSelector와 Condition
안녕하세요.조건부 자동구성 강의를 보면서 Spring은 사용자가 직접 구성한 Configuration클래스가 전부 로딩이 되고난 후, 자동 구성정보가 적용되도록 만들기 위해 DeferredImportSelector를 구현한다고 이해했습니다.근데 강의 초반의 흐름을 생각해보니, Spring이 초기화되는 타이밍에 ServletContainer에 dispatcher가 등록되면서 시작하고 그다음에 메인클래스가 register되고 이때 메인은 ComponentScan을 메타로 달고있기에 이 시점에 컴포넌트들이 읽히면서 등록되는구나 싶엇는데.. 이 부분이 헷갈리네요.분명 위의 흐름대로라면 자동 구성영역이 먼저 등록됐기 때문에 Tomcat도 getBean할 수 있었을텐데..spring은 미리 뭐 클래스영역에 있는 메타정보로 자동구성을 대체할 수 있는 빈이 있는지를 먼저 볼수있고 지나칠수있는.. 그런걸까요..? 궁금합니다
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 및 커밋 질문드립니다.
1. "자동커밋모드에서 수동커밋모드로 변환하는것" 을 트랜잭션을 시작한다라고 표현하는것일까요? 아니면 "수동커밋모드로 작업을 하는것" 을 트랜잭션을 시작한다고 표현하는것일까요?2. 강의 14분경에, memberRepository.update() 코드에서 "트랜잭션이 없어서 auto commit된다" 라고 말씀하셨습니다. 여기서 "트랜잭션이 없어서 auto commit 된다" 는게 무슨의미인지 잘 모르겠습니다. 2-1. 트랜잭션이 없다는게 트랜잭션을 시작하지 않았다는것일까요? 2-2. 수동커밋모드가 아니라서 트랜잭션이 없고 트랜잭션이 시작하지않은것일까요?2-3. 트랜잭션이 없으면 무조건 auto commit일까요?3. 트랜잭션이라는것이 수동커밋모드로 하고나서, 쿼리를 실행하고, commit이나 rollback을 하는 과정을 의미하는게 맞을까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 및 커밋 질문 드립니다.
0
-
미해결토비의 스프링 부트 - 이해와 원리
커스톰 @Conditional 에서 다양하게 의존성 주입이 가능한가요?
@Conditional 강의를 들으면서, 특정 조건(Condition)에 따라서 의존성 주입을 A, B로 변경할 수 있어서 흥미롭게 보게되었습니다.토비님께서 예제로 설명해주신 웹서버 설정외에 다른 방법도 가능할까요?matches 메서드 안에서 DB를 조회하여, 해당 값으로 인해 A, B로 의존성 주입이 가능할까요??-> 서비스 빈을 찾아서 jpaRepository로 조회할려고 하니, jpaRepository가 null이 되어 아직 주입되지 않는 듯 합니다. 다른 방법이 있을까요?사용자구성정보랑 자동구성정보의 빈 생성 시점이 달라서 인지 궁금합니다.gradle 설정에서 implement의 설정에 따라서 @Conditional matches로 의존성주입이 가능하던데, 마찬가지로 멀티모듈구성시 모듈의 주입되지 않을경우, @ConditionalOnMissingBean으로 멀티모듈의 빈이 아닌 해당빈으로(디폴트 빈)으로 설정이 가능한지 궁금합니다.바쁘실텐데 답변주시면 감사하겠습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
h2 database 연결 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]선생님 h2에 서버 모드로 연결하려고 할 때 해당 오류가 발생합니다. 도와주세요 ㅜㅜ 도저히 저의 힘으로 해결 할 수가 없습니다.IO Exception: "/Users/jonghyunlee/test outside /opt/homebrew/var/sonarqube/data" [90028-224] 90028/90028 (도움말)org.h2.jdbc.JdbcSQLNonTransientException: IO Exception: "/Users/jonghyunlee/test outside /opt/homebrew/var/sonarqube/data" [90028-224] at org.h2.message.DbException.getJdbcSQLException(DbException.java:566) at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.engine.ConnectionInfo.setBaseDir(ConnectionInfo.java:250) at org.h2.server.TcpServerThread.run(TcpServerThread.java:152) at java.base/java.lang.Thread.run(Thread.java:840) at org.h2.message.DbException.getJdbcSQLException(DbException.java:566) at org.h2.engine.SessionRemote.readException(SessionRemote.java:650) at org.h2.engine.SessionRemote.done(SessionRemote.java:619) at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:148) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:438) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:330) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:125) at org.h2.util.JdbcUtils.getConnection(JdbcUtils.java:288) at org.h2.server.web.WebServer.getConnection(WebServer.java:811) at org.h2.server.web.WebApp.login(WebApp.java:1039) at org.h2.server.web.WebApp.process(WebApp.java:227) at org.h2.server.web.WebApp.processRequest(WebApp.java:177) at org.h2.server.web.WebThread.process(WebThread.java:154) at org.h2.server.web.WebThread.run(WebThread.java:103) at java.base/java.lang.Thread.run(Thread.java:1583)
-
미해결토비의 스프링 부트 - 이해와 원리
섹션3 HelloController, DemoAppication
둘다 Mapping이 "/hello"인데실행을 하면 DemoApplication에서 정의한 hello가 매핑되는건 왜인가요??(HelloController는 안타는 이유가 뭘까요?)
-
미해결토비의 스프링 부트 - 이해와 원리
섹션2 hello project
@RestController public class helloController { @GetMapping("/hello") public String hello(String name){ return "hello"+name; }}안녕하세요, @RequestParam을 안쓰는 이유가 무엇인가요?
-
해결됨토비의 스프링 부트 - 이해와 원리
메타 어노테이션
안녕하세요.@Component 나 @Controller 또한 Target(ElementType.TYPE)으로만 설정되어있는데, 어떻게 @Configuration이나 @RestController 등과 같이 메타 어노테이션으로 설정될수있는건지 질문드립니다ㅜㅜ
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
데이터 접근 예외 직접만들기 코드 질문있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. public void create(String memberId){ try{ repository.save(new Member(memberId,0)); log.info("saveId = {}",memberId); }catch(MyDuplicateKeyException e){ log.info("키 중복, 복구 시도"); String retryId = generateNewId(memberId); log.info("retryId = {}",retryId); repository.save(new Member(retryId,0)); }catch(MyDbException e){ log.info("데이터 접근 계층 예외",e); throw e; } } private String generateNewId(String memberId){ return memberId + new Random().nextInt(10000); }현재 이런식으로 중복된 Id가 있다면 그 뒤에 랜덤한 숫자를 덧붙여서 새로운 Id를 만들어서 재시도 하는것으로 이해했습니다.사실 완전 중복되는것을 막으려면 실제로는 UUID같은것을 생성하면 된다고 생각하지만..이 문제의 경우에서, 새롭게 만든 Id마저도 중복이 되면 오류가 나는것을 확인했습니다.만약 예외가 발생해서 해당 예외를 복구하기위해 재시도를 했으나 그것마저도 실패하는 경우에는 catch구문안에서 또 try~catch를 해야하는건가요?.. 어떤 방법이 있는지 궁금합니다.읽어 주셔서 감사합니다
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
db, jdbc, jpa 등 관계 정리 문의
현재 트랜잭션관하여 강의를 듣고있는 중입니다. jdbc 트랜잭션 코드랑 jpa 트랜잭션 코드랑 다르다고 하셨는데 이 부분에서 관계정리가 안되거 같아 질문드립니다.위의 사진처럼 이해하면 되나요?? jpa에서 자체적으로 데이터소스를 관리하는지 jdbc 트랜잭션 코드라고 설명을 해주셨는데 여기서 jdbc가 의미하는게 데이터소스 코드를 의미하는지 위의 두개의 질문도 궁금합니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
JDBC 질문 드립니다.
안녕하세요. 현재 9강까지 강의를 들은 상태입니다.다름이아니라, 현재 9강까지는 JDBC를 사용하는 부분을 학습하고 있는데요. 여기서 JDBC를 사용한다는게 구체적으로 어떤것을 의미하는지 질문드립니다.JDBC를 사용한다는것이 DriverManager를 사용하는것을 말하는것일가요? 아니면 DriverManager뿐만아니라, Connection, PreparedStatement, ResultSet를 사용하는것을 말하는것일까요? 헷갈려서 질문드립니다..!
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
set autocommit 질문
set autocommit false; 인 상황에서delete from member; 를 수행한 뒤에 commit을 하지 않고, set autocommit true; 를 해보았습니다.그랬더니, db에 데이터가 없는 것을 확인했습니다. 혹시 set autocommit true; 명령어를 수행시키는 순간 commit이 한번 자동으로 실행되는 것일까요?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
h2 버전 질문드립니다...
안녕하세요.강의에서 말씀하시기를 인텔리제이 내 라이브러리에 명시되어있는 h2의 버전을 다운로드 받으라고 말씀하셨고, 강의 자료에서는 스프링부트 2.x를 사용하면 1.4.200버전을 다운로드해야되고, 스프링부트 3.x를 사용하면 2.1.214버전을 다운로드 해야된다고 말씀하셨는데요. 제 인텔리제이 프로젝트의 gradle 및 라이브러리를 보면 스프링부트의 버전은 2.7.14이고, h2의 버전은 2.1.214라고 나와있습니다.이럴때에는 h2의 어떤 버전을 다운로드 해야되는지 질문드립니다.. 현재 저의 스프링부트의 버전이 2.x라서 1.4.200버전을 다운로드해서 진행하고 있었는데 혹시 추후에 문제가 될게 있을까봐 질문드립니다.. h2의 어떤 버전을 다운로드 해야될까요?
-
미해결토비의 스프링 부트 - 이해와 원리
프로퍼티 클래스의 분리 강의중 this 의 사용에 궁금증이 있습니다.
안녕하세요 강의를 열심히 듣다가 궁금증이 생겨 문의드립니다. filed에 선언된게String contextPath, int port 이렇게 두가지인데 factory에 set 할때는 contextPath에는 this.contextPath그 밑 port에서는 this를 사용하지 않았습니다.this를 생략하여도 같은 필드변수를 가져오는것일까요 ?(제 생각에는 같은 필드변수를 가져온다고 생각합니다. )두개가 어떤 차이를 가지는지 알고 싶습니다.( 제 생각엔 port 에도 this. 가 생략되어있다고 생각됩니다.) 질문을 읽어주셔서 감사합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 세션 질문
1:55 쯤에서 영한님이 커넥션 10개를 생성하면, 세션도 10개 만들어진다고 하셨습니다. 그럼 1개의 커넥션에는 1개의 세션이 만들어진다가 맞나요?커넥션과 세션은 일대일 매칭인건가요?여러 커넥션이 하나의 세션을 바라보거나 하나의 커넥션이 여러 세션을 생성할 수는 없을까요?