목록전체 글 (531)
개발놀이터
*연관관계의 주인 연관관계의 주인 딜레마는 양방향 연관관계에서 고민해야할 문제인데 양방향 매핑 규칙이 있다. 연관관계의 주인이란 단방향 연관관계를 두개를 만들어야하는 양방향 연관관계에서 둘 다 객체를 만들어버리면 예를들어 Member, Team 두개에서 Team클래스에서는 Member member로 단방향 매핑을 구축하고 Member 클래스에서는 Team team으로 단방향 매핑을 구축하면 둘 중 어떤 클래스에서 디비에 있는 FK를 수정할지 결정을 해야한다. 이것이 바로 연관관계의 주인이다. 양방향 매핑 규칙 1. 객채의 두 관계중 하나를 연관관계의 주인으로 지정 2. 연관관계의 주인만이 외래키를 관리 (등록, 수정) 3. 주인이 아닌 쪽은 읽기만 가능 4. 주인은 mappedBy 속성 사용 X 5. 주..
*기본 키 매핑 기본 키 매핑 방법 1. 직접 할당 (@Id) 2. 자동 생성 (@GeneratedValue) -IDENTITY : 데이터베이스에 위임, MYSQL -SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE (@SequenceGenerator 필요) -TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용 (@TableGenerator 필요) -AUTO : 방언에 따라 자동 지정, 기본값 *IDENTITY 전략 -@GeneratedValue(strategy = GenerationType.IDENTITY) -기본 키 생성을 데이터베이스에 위임 -주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용 (ex) MySQL의 AUTO_INCREMENT) -JP..
*엔티티 매핑 @Entity -@Entity가 붙은 클래스는 JPA가 관리, 엔티티라고 한다. -JPA를 사용해서 테이블과 매핑할 클래스는 @Entity필수 -주의 1. 기본생성자 필수 2. final 클래스, enum, interface, inner 클래스 사용 X 3. 저장할 필드에 final 사용 X *@Table(name = "Member") -테이블 명과 매핑시킬 수 있음 -관례는 클래스 이름이 테이블 이름과 매핑됨 *@Column(name = "username") -컬럼명을 매핑 시키는 어노테이션 -객체를 사용할 때 변순는 name으로 사용하고 싶고 실제 디비상에서의 컬럼은 username이라고 되어있을 때 매핑하기 위한 어노테이션 @Column의 속성 -name = "username" 필드와..
*JPA에서 가장 중요한 2가지 1. 객체와 관계형 데이터베이스 매핑하기 2. 영속성 컨텍스트 *영속성 컨텍스트 정의 : 엔티티를 영구저장하는 환경 디비에 저장한다는 개념이 아니라 영속성 컨텍스트를 통해서 엔티티를 영속화를 한다는것 = 영속성 컨텍스트에 저장한다는 것 엔티티 매니저는 영속성컨텍스트를 1대1로 가지고 있다. 영속성컨텍스트는 눈에 보이지 않는 논리적인 개념이다. *비영속 member 객체를 생성하고 엔티티매니저에 아무것도 넣지않은 상태 Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 이렇게 JPA가 관여하지 않은 객체 생성의 상태 *영속 em.persist(member); 이런식으로 객체를 저장..
*JPA JPA 시작하기 1. META-INF/persistence.xml에 정보를 입력한다. (jdbc드라이버, user, password, jdbc url, dialect 이렇게 설정을 해준다음에 2. JPA를 시작하려는 클래스에 EntityManagerFactory emf = persistence.createEntityManagerFactory(persistence.xml에 있는 persistence-unit 을 적어준다) 3. EntityManager em = emf.createEntityManager(); 4. EntityTransaction tx = em.getTransaction(); 5. DTO를 만들어주고 @Entity를 적어서 jpa가 이 클래스를 관리하도록 어노테이션을 적는다. 6. ..
*RedirecAttribute 파라미터에 RedirectAttribute 를 추가해주면 기능을 사용할 수 있는데 public String item(RedirectAttributes, redirectAttributes) 이렇게 추가해주면 사용 가능하다 redirectAttributes.addAttribute(attributeName, attributeValue) 이렇게 사용 가능하다. redirectAttributes.addAttribute("itemId", itemId); 이렇게 쓰면 뷰 템플릿을 호출할 때 return "/basic/item/${itemId}" 이렇게 경로변수로 사용할 수 있다. 경로변수로 사용되지 못한 addAttribute는 쿼리 파라미터로 넘어가게 된다. redirectAttri..
*타임리프 간단한 문법 *타임리프 선언http://www.thymeleaf.org"> *속성 변경 th:href="@{/css/bootstrap.min.css}" -href="value1"를 th:href="value2"의 값으로 변경한다. -타임리프 뷰 템플릿을 거치게 되면 원래 값을 th:xxx값으로 변경한다. 만약 값이 없다면 새로 생성한다. -html을 그대로 볼 때는 href 속성이 사용되고, 뷰 템플릿을 거치면 th:href의 값이 href로 대체되면서 동적으로 변경할 수 있다. -대부분 html속성을 th:xxx로 변경할 수 있다. *타임리프 핵심 -핵심은 th:xxx가 붙은 부분은 서버사이드에서 렌더링되고, 기존 것을 대체한다. th:xxx이 없으면 기존 html의 xxx속성이 그대로 유지..
*로깅 롬복의 @Slf4j어노테이션 사용 or private final Logger log = LoggerFactory.getLogger(getClass()); 올바른 로그 사용법 log.info("username={}", username); *요청 매핑 @RequestMapping(value = "/hello-basic" method = "RequestMethod.GET") 이거 두개를 합친것이 바로 @GetMapping *@ResponseBody 이거 쓰면 return 값을 문자열로 반환했을 때 HTTP메시지 바디에 꽂혀서 전송됨 *@PathVariable 경로 변수 /username/{username} 이런식으로 URL을 템플릿화 시켜서 보냄 가져오는 방법 public String getPathVa..
*HTTP 응답 - HTTP API, 메시지 바디에 직접 입력 -response.getWriter를 이용한 출력 @GetMapping("/response-body-string-v1") public void responseBodyV1(HttpServletResponse response) throws IOException { response.getWriter().write("ok"); } -ResponseEntity를 이용한 출력 (상태코드 같이 출력 가능) @GetMapping("/response-body-string-v2") public ResponseEntity responseBodyV2(HttpServletResponse response) { return new ResponseEntity("ok", ..
*HTTP 응답 - 정적 리소스, 뷰 템플릿 스프링에서 응답 데이터를 만드는 방법은 크게 3가지이다. 1. 정적 리소스 : ex) 웹 브라우저에 정적인 HTML, css, js를 제공할 때는, 정적리소스를 사용한다. 2. 뷰 템플릿 사용 : ex) 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다. 3. HTTP 메시지 사용 : HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP메시지 바디에 JSON같은 형식으로 데이터를 실어 보낸다. 1. 정적 리소스 스프링 부트는 클래스패스의 다음 디렉토리에 있는 정적 리소스를 제공한다. /static, /public, /resources, /META-INF/resources src/main/resources는 리..