ํ๋ค๋ฉด ํ์๋ด์!!
Posts
Q&A
persist ์ํ์ ๋ฎ์ด ์์์ ธ ๋ฒ๋ฆฌ๋ ๋ฌธ์
ํด๊ฒฐ๋์์ต๋๋ค์ฌ๋ ค์ฃผ์ 2024 ์์ค์ฝ๋์์๋ http://hibernate.hbm2ddl.auto ์ต์ ์ด ์ฃผ์์ฒ๋ฆฌ๊ฐ ๋์ด์์ง ์์์.... ๋งค๋ฒ ์ฟผ๋ฆฌ๋ฅผ ์ํํ ๋๋ง๋ค ํ ์ด๋ธ์ ์ด๊ธฐํํด์ ๋ฐ์ํ ๋ฌธ์ ์๋ค์....
- 6
- 5
- 730
Q&A
์๋ธ๋ฆฟ์ ๊ฐ๋ ์ ํ์คํ๊ฒ ์ก๊ณ ์ถ์ต๋๋ค.
๋จผ์ 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
- 508
Q&A
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
- 537
Q&A
FilterChainProxy ๊ถ๊ธํ๊ฒ ์์ด์
์คํ๋ง ์ํ๋ฆฌํฐ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ํํฐ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ ๋๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค.Http ์์ฒญ -> WAS -> ์๋ธ๋ฆฟ -> ํํฐ1 -> ํํฐ2 ... -> DelegatingFilterProxy -> ์คํ๋ง ์ํ๋ฆฌํฐ ๊ด๋ จ ํํฐ... -> ๋์คํจ์ฒ ์๋ธ๋ฆฟ -> ์ธํฐ์ ํฐ1 -> ์ธํฐ์ ํฐ2 ... -> ์ปจํธ๋กค๋ฌ DelegatingFilterProxy์ ๋ฑ์ฅ์ผ๋ก ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ํํฐ ๊ธฐ๋ฅ์ ์คํ๋ง ์ปจํ ์ด๋์์ ์ฌ์ฉํ ์ ์๊ฒ ์คํ๋ง ๋น์ ๋ฑ๋กํ ์ ์๊ฒ ๋๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค.
- 0
- 2
- 637
Q&A
์๊ฐ๋ณต์ก๋ ๊ฐ์ ์ง๋ฌธ
์๋ ํ์ธ์. ์ฌ์๋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
- 870
Q&A
์ฐ๊ธฐ์ง์ฐ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
- 901
Q&A
persist์ ๋ํ์ฌ...
์๋ ํ์ธ์^^๊ธฐ๋ณธ ํค ๋งคํ ์ ๋ต IDENTITYIDENTITY ์ ๋ต์ em.persist() ์์ ์ฆ์ INSERT SQL ์คํํ๊ณ DB์์ ์๋ณ์๋ฅผ ์กฐํํฉ๋๋ค.์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋๋ ค๋ฉด PK๊ฐ ๋ฌด์กฐ๊ฑด ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ commit์ SQL์ด ๋ ์๊ฐ์ง ์์ต๋๋ค.๋ฐ๋ผ์ em.persist()๋ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.^^
- 1
- 2
- 458
Q&A
๋์ ํ๋ก์ SRP
์๋ ํ์ธ์pj5016๋ ์ ๊ฐ ์ดํดํ๊ณ ์๋ ์ง์์ด ๋์์ด ๋๊ณ ์ ๋ต๋ณ ๋๋ฆฝ๋๋ค. ๋ถ๊ฐ ๊ธฐ๋ฅ ๋ก์ง๋ ํ๋์ ํด๋์ค์ ๋ชจ์์ ๋จ์ผ ์ฑ ์ ์์น(SRP)๋ ์งํฌ ์ ์๊ฒ ๋์๋ค. ๋ถ๋ถ์ด ์ดํด๊ฐ ์ ์๋์ ๋ค๊ณ ๋ง์ํ์ จ๋๋ฐ, ์ ๊ฐ ์ดํดํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.๊ธฐ์กด์๋ ๋์ผํ ๊ธฐ๋ฅ(๋ก๊ทธ ์ถ์ )์ ํ๋ ํด๋์ค๋ฅผ ๊ตฌํํ์ต๋๋ค. (์ด ๋ง์ ํ์ฌ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ์ฌ๋ฌ๊ฐ์ ํด๋์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ค๋ ์๋ฏธ ์ ๋๋ค.)ํ์ง๋ง ๋์ ํ๋ก์ ๊ธฐ์ ์ ์ฌ์ฉํจ์ผ๋ก์จ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ํด๋์ค๋ฅผ 1๊ฐ๋ง ๋ง๋ค๊ณ ๊ด๋ฆฌํ ์ ์๋ค๋ ์๋ฏธ๋ก SRP๋ฅผ ์งํฌ ์ ์๋ค๊ณ ๋ง์ํ์ ๊ฒ ๊ฐ๋ค์.(๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ํด๋์ค๋ฅผ ์ฌ๋ฌ๊ฐ ๋ง๋ค ํ์๋ ์์ผ๋๊น์ใ ใ ) ๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 550
Q&A
loginPage ๋ฆฌ๋ค์ด๋ ์ ๋ฃจํ ๋ฌธ์
์ ์ ๊ฐhttp .formLogin() .loginPage("/loginPage") //์ฌ์ฉ์ ์ ์ ๋ก๊ทธ์ธ ํ์ด์ง .defaultSuccessUrl("/") .failureUrl("/login") .usernameParameter("userId") .passwordParameter("passwd") .loginProcessingUrl("/login_proc") .successHandler(loginSuccessHandler) .failureHandler(loginFailureHandler) .permitAll(); ์ด๋ถ๋ถ์์ ๋ง์ง๋ง์ permitAll()์ ๋ฃ์ง ์์์ ์๊ธด ๋ฌธ์ ์์ต๋๋ค.!
- 1
- 1
- 1.2K
Q&A
Querydsl ์ค์ ๊ณผ ๋น๋ ์ง๋ฌธ ์ ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.^^
- 1
- 4
- 2.5K