소개
힘들면 힘을내자!!
게시글
팀프로젝트
모집완료
[홍보 | 사이드 프로젝트] 혼자 끙끙 앓던 개발고민, 다른 사람들은 어떻게 생각할까?
- 1
- 0
- 473
질문&답변
persist 수행시 덮어 씌워져 버리는 문제
해결되었습니다올려주신 2024 소스코드에서는 http://hibernate.hbm2ddl.auto 옵션이 주석처리가 되어있지 않아서.... 매번 쿼리를 수행할때마다 테이블을 초기화해서 발생한 문제였네요....
- 6
- 5
- 604
팀프로젝트
모집완료
[마감 | 사이드 프로젝트 | 출시 목표] 초기 멤버로 합류하실 프론트엔드 개발자분 모십니다.
- 3
- 0
- 628
질문&답변
서블릿의 개념을 확실하게 잡고 싶습니다.
먼저 WAS가 등장하게 된 배경은동적으로 리소스를 처리하고 싶어 등장한 것으로 알고 있습니다. 그런데 WAS 그자체를 사용하면 개발자가 해야할 작업이 너무 많은 것이죠.서버 TCP/IP 연결 및 종료, HTTP 요청 메시지 파싱, HTTP Method 및 URL 인지 등등개발자에게 가장 중요한것은 비지니스 로직을 개발하는 일 인데,,,, 모든 작업을 반복적으로 하는것이 과연 의미가 있을까요? 그래서 등장한 것이 서블릿 입니다.WAS에서 1차적으로 HTTP 메시지를 파싱하고 비지니스 로직에 필요한 메시지는 따로 서블릿에서 이용할 수 있게 HttpServletRequest, HttpServletResponse 에 담아주는 것이죠.개발자들이 비니지스 로직만 따로 처리할 수 있도록 환경을 구성해 준것이라고 생각합니다.(서블릿은 WAS안에 존재합니다.)@WebServlet(name = "helloServlet", urlPatterns = "/hello") public class HelloServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) { //비지니스 로직 } }urlPatterns(“/hello”)의 URL이 호출되면 서블릿 코드가 실행HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequestHTTP 응답 정보를 편리하게 사용할 수 있는 HttpServletResponse 하지만, 이마저도 불편하다고 여겨서스프링 컨테이너에서 동작하는 디스패처 서블릿이 등장하고개발자들은 컨트롤러를 구현해서 사용하도록 해준것으로 알고 있습니다. 감사합니다.
- 0
- 1
- 428
질문&답변
Model은 무엇을 가리키는 건가요?
MVC 패턴에서 Model은 View와 Controller 사이에 데이터를 주고받기 위한 DTO라고 생각하셔도 좋을 것 같네요. 흐름View -> Model -> Controller Controller -> Model -> View (사진)참고https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC 감사합니다.
- 0
- 2
- 442
질문&답변
FilterChainProxy 궁금한게 있어요
스프링 시큐리티는 서블릿 컨테이너의 필터 방식으로 구성 된것으로 알고 있습니다.Http 요청 -> WAS -> 서블릿 -> 필터1 -> 필터2 ... -> DelegatingFilterProxy -> 스프링 시큐리티 관련 필터... -> 디스패처 서블릿 -> 인터셉터1 -> 인터셉터2 ... -> 컨트롤러 DelegatingFilterProxy의 등장으로 서블릿 컨테이너의 필터 기능을 스프링 컨테이너에서 사용할 수 있게 스프링 빈을 등록할 수 있게 된것으로 알고 있습니다.
- 0
- 2
- 572
질문&답변
시간복잡도 강의 질문
안녕하세요. 재영님N 까지 반복하는 loop가 1개라면시간복잡도는 O(N) 입니다.for(int i = 0; i N 까지 반복하는 loop안에 또 N까지 반복하는 loop가 존재한다면 시간복잡도는 O(N^2) 인것으로 알고 있습니다.for(int i = 0; i 만약 아래와 같으면 상수는 무시하기 때문에O(N)으로 표기하는 것으로 알고 있습니다.for(int i = 0; i 감사합니다.
- 1
- 1
- 760
질문&답변
쓰기지연SQL저장소는 정말 스냅샷과 비교하나요?
아래 댓글을 참고하여 수정했습니다. 안녕하세요. 심한수님부족하지만 제가 알고 있는 지식이 도움이 되었으면 좋겠다는 마음에 답변 드립니다. 먼저 엔티티는 PK로 관리되는것으로 알고 있습니다.그리고 em.merge()는 준영속(detach) 상태의 엔티티를 통해 영속(managed) 상태의 새로운 엔티티를 반환 해주는 메소드로 알고 있습니다. merge()를 사용하게 되면 select 쿼리가 발생하고, 조회한 객체를 반환합니다.즉, merge()로 반환되는 새로운 객체가 영속(managed) 상태 입니다.풀어서 이야기하면, merge(entity)는 entity를 영속화 시키는 것이아니라, newEntity를 반환하며 newEntity가 영속 상태라는 말씀을 드립니다. 하지만, 심한수님의 경우에는 처음부터 save() 메소드에서 merge()를 실행하게 됩니다.심한수님의 경우에 save()메소드에서 merge()를 실행하는 이유는 다음과 같습니다.@Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } }isNew() 메소드는 엔티티의 PK가 null 이거나 원시타입인 경우는 초기값(0) 인 경우만 true, 그외는 false 처리 됩니다.따라서 id를 300L로 설정했기 때문에 merge() 메소드를 실행합니다.(초기값이 null이 아니기 때문입니다.) merge 메소드 내부를 보면 설정한 id값으로 select 를 하여해당 엔티티를 조회하고 영속상태의 새로운 엔티티를 반환 합니다.(fastSessionServices.eventListenerGroup_MERGE.fireEventOnEachListener( event, MergeEventListener::onMerge); 메소드 까지는 어떻게 동작하는지 저도 잘 모르겠습니다. ㅠㅠ)private Object fireMerge(MergeEvent event) { try { checkTransactionSynchStatus(); checkNoUnresolvedActionsBeforeOperation(); // select 쿼리 실행 fastSessionServices.eventListenerGroup_MERGE.fireEventOnEachListener( event, MergeEventListener::onMerge ); checkNoUnresolvedActionsAfterOperation(); } catch ( ObjectDeletedException sse ) { throw getExceptionConverter().convert( new IllegalArgumentException( sse ) ); } catch ( MappingException e ) { throw getExceptionConverter().convert( new IllegalArgumentException( e.getMessage(), e ) ); } catch ( RuntimeException e ) { //including HibernateException throw getExceptionConverter().convert( e ); } return event.getResult(); } 간단한 테스트를 예제로 보여드리겠습니다.TestEntity@Entity @Setter @Getter public class TestEntity { @Id private String id; private String name; } SaveTest@SpringBootTest public class saveTest { @Autowired TestEntityRepository repository; @Test void jpaSaveTest() { // uuid 생성 String id = UUID.randomUUID().toString(); TestEntity testEntity = new TestEntity(); testEntity.setId(id); testEntity.setName("비영속상태 객체 생성"); /** * merge를 실행합니다.(persist가 실행되지 않습니다.) * * save() 메소드에 있는 * isNew() 메소드는 * 엔티티의 PK가 null 이거나 * 원시타입인 경우는 초기값(0)인 경우만 true, * 그외는 false 처리 됩니다. */ TestEntity newEntity = repository.save(testEntity); System.out.println("name1="+newEntity.getName()); /** * newEntity 영속(managed) 상태가 아닙니다. * 그 이유는 save() 이후 커밋을 완료했기 때문입니다. * save()를 보면 @Transactional이 있는 것을 확인할 수 있습니다. * 따라서 save() 즉, merge()를 통해 반환되는 newEntity는 비영속(new) 상태 입니다. * 그 결과 변경감지가 일어나지 않습니다. */ newEntity.setName("변경감지 확인"); System.out.println("name2="+newEntity.getName()); } } 결과Hibernate: select testentity0_.id as id1_5_0_, testentity0_.name as name2_5_0_ from test_entity testentity0_ where testentity0_.id=? Hibernate: insert into test_entity (name, id) values (?, ?) name1=비영속상태 객체 생성 name2=변경감지 확인 감사합니다.^^
- 3
- 1
- 795
질문&답변
persist에 대하여...
안녕하세요^^기본 키 매핑 전략 IDENTITYIDENTITY 전략은 em.persist() 시점 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회합니다.영속성 컨텍스트에 관리되려면 PK가 무조건 있어야 하기 때문에 commit에 SQL이 날아가지 않습니다.따라서 em.persist()는 쓰기 지연 SQL 저장소를 사용할 수 없습니다. 감사합니다.^^
- 1
- 2
- 377
질문&답변
동적 프록시 SRP
안녕하세요pj5016님 제가 이해하고있는 지식이 도움이 되고자 답변 드립니다. 부가 기능 로직도 하나의 클래스에 모아서 단일 책임 원칙(SRP)도 지킬 수 있게 되었다. 부분이 이해가 잘 안되신다고 말씀하셨는데, 제가 이해한 내용은 다음과 같습니다.기존에는 동일한 기능(로그 추적)을 하는 클래스를 구현했습니다. (이 말은 현재 동일한 기능을 하는 여러개의 클래스를 구현하고 있다는 의미 입니다.)하지만 동적 프록시 기술을 사용함으로써 동일한 기능을 하는 클래스를 1개만 만들고 관리할 수 있다는 의미로 SRP를 지킬 수 있다고 말씀하신 것 같네요.(동일한 기능을 하는 클래스를 여러개 만들 필요는 없으니까요ㅎㅎ) 감사합니다.
- 0
- 2
- 452