- 방문자수
- 최근 기록들
전체 방문자
오늘 방문자
어제 방문자
부딛히기!
-
도커로 띄워지지 않는 나의 프로젝트 문제 해결(springboot + mariadb + springsecurity)
저의 프로젝트 배포하는 것을 공부하기 위해Docker를 이용하여 나의 프로젝트를 띄워보았습니다. 저의 프로젝트는 영한님 강의 시청 후 다른 교재를 참고하여 만들었고맛집 게시판 프로젝트이며게시글과 댓글을 crud 하는 것입니다. 프로젝트에 대해서는스프링부트 3.3.0 버전 mariadb스프링시큐리티 6 버전을 사용하였습니다. 도커 공부용으로 사용한 빈 프로젝트(간단한 컨트롤러 설계한 것)는 쉽게 띄워졌는데나의 프로젝트에 적용시켜보니 매핑이 안된다는 에러 페이지가 띄워져서처음에는 도커에 대해서 내가 올바르게 사용하지 않았나 싶어강의들을 찾아보았는데도커 쪽에서는 문제가 없어 보였습니다. 처음엔 스프링시큐리티와 도커가 충돌하는 것일까에 대한 의문을 가졌는데구글링을 해본 경과 스프링시큐리티 설정과는 관련이..
-
추천 게시판 디자인과 값 넘기기 중 부딪힘 (모달창)
(* 차근차근 학습해나가는 과정이라 글 내용에 오류가 있을 수 있습니다. 피드백 주시면 반영하겠습니다.) 1. tabindex 와 모달창의 관계? (위 사진의 별점은 starrr 라이브러리(jQuery의 플러그인)를 이용하였습니다.) (위 프로젝트는 '코드로 배우는 스프링 부트 웹 프로젝트' 교재를 참고하였습니다.) $(".reviewModal").modal("show"); 위와 같이 모달창을 띄우도록 js코드를 작성하던 중, 저 코드를 주석처리하지 않으니 글 작성 후 저장이나 수정을 해도 모달창이 사라지지 않는 현상이 발생했다. 작성한 값들은 잘 넘어가고 화면에도 정상적으로 반영되었으나, 모달창만 어째서인지 계속 띄워지는 현상이었다. 해결은 주석처리로 간단하게 해결되었으나, 필요한 모달창들에는 tabi..
Spring + Boot
-
JPA - 엔티티 기본 생성자
- Entity는 반드시 파라미터가 없는 생성자(기본 생성자)가 있어야 함 (public 또는 protected) - 기본 생성자가 필요한 이유는 스프링 데이터 JPA 에서 엔티티에 동적으로 객체 생성시 JAVA Reflection API를 활용하기 때문 (JPA는 DB 값을 객체 필드에 주입할 때 기본 생성자로 객체를 생성한 후 Reflection API를 사용하여 값을 매핑 >> 기본 생성자가 없다면 Reflection은 해당 객체를 생성 할 수 없음) - setter는 사용하지 말아야 함!! >> 1. Entity의 모든 필드에 public setter 메소드를 생성하면 객체의 값의 변경이 개방되어 있기에 일관성을 보장할 수 없음 setter 메소드를 제공하는 것 보단 확실한 비즈니스가 드러나는 메..
-
Orm 표준 jpa 프로그래밍 (6) - 객체 지향 쿼리 언어
0. - JPA는 다양한 쿼리 방법을 지원 (JPQL / JPA Criteria / QueryDSL / 네이티브SQL / JDBC API 직접 사용 등 ...) 조회 방법1 - EntityManager.find() - 객체 그래프 탐색(a.getB().getC()) - JPA를 사용하면 엔티티 객체를 중심으로 개발함 - 단, 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 - 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 - 어플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL 필요함 - JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 - SQL과 유사한 문법(select, from, where, group by, having, joi..
-
Orm 표준 jpa 프로그래밍 (5) - 값 타입
0. JPA의 데이터 타입 엔티티 타입 - @Entity로 정의하는 객체 - 데이터가 변해도 식별자로 지속해서 추적 가능 (식별자: DB에서 인스턴스의 집합인 엔티티를 구분할 수 있는 논리적인 값, 하나의 엔티티에 구성되어 있는 여러가지 속성중에 대표할 수 있는 속성) ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 - int, integerm String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 - 식별자가 없고 값만 있으므로 변경시 추적 불가 ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 - 기본값 타입: 자바 기본 타입(int, double), 래퍼 클래스(Integer, Long), String - 임베디드 타입 - 컬렉션 ..
-
Orm 표준 jpa 프로그래밍 (4) - 매핑, 프록시
1. 상속관계 매핑 - 관계형 DB는 상속관계가 없음 - 슈퍼타입 / 서브타입 관계의 모델링 기법이 객체의 상속과 유사 - 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 / 서브타입 관계를 매핑 슈퍼타입 / 서브타입 논리 모델을 물리 모델로 구현하는 방법 1. @Inheritance(strategy=InheritanceType.XXX) - 각각 테이블로 변환 => 조인 전략 (JOINED) - 통합 테이블로 변환 => 단일 테이블 전략 (SINGLE_TABLE) - 서브타입 테이블로 변환 => 구현 클래스마다 테이블 전략 (TABLE_PER_CLASS) 2. @DiscriminatorColumn(name=“DTYPE”) 3. @DiscriminatorValue(“XXX”) 조인 전략 - 장점: 테..
-
Orm 표준 jpa 프로그래밍 (3) - 연관관계 매핑
ex1. 객체를 테이블에 맞추어 모델링 // (참조 대신에 외래키를 그대로 사용) @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @Column(name = "TEAM_ID") private Long teamId; ... } @Entity public class Team { @Id @GeneratedValue private Long id; private String name; ... } // (외래 키 식별자를 직접 다룸) //팀 저장 Team team = new Team(); team.setName("TeamA"); em.persist(team);..
-
Orm 표준 jpa 프로그래밍 (2) - 엔티티 매핑
- 객체와 테이블 매핑: @Entity, @Table - 필드와 컬럼 매핑: @Column - 기본 키 매핑: @Id - 연관관계 매핑: @ManyToOne, @JoinColumn, ... 1. @Entity - @Entity가 붙은 클래스는 jpa가 관리하고, 엔티티라 부른다. - jpa를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 주의점 1. 기본 생성자 필수( 파라미터가 없는 public 또는 protected 생성자 ) 2. final 클래스, enum, interface, inner 클래스는 사용하지 않는다 3. 저장할 필드에 final 사용하지 않는다. 속성 1. name: jpa에서 사용할 엔티티 이름을 지정하며, 기본값으로 클래스 이름을 그대로 사용하고, 중복된 이름의 클래스가 ..
-
Orm 표준 jpa 프로그래밍 (1) - 영속성 관리 (주석 내용 추가 예정)
1. 영속성 컨텍스트 (PersistenceContext) - jpa를 이해하는데 가장 중요한 용어 - 엔티티를 영구 저장하는 환경 - 'EntitiyManger.persist(entity);'를 통해 생성 - 영속성 컨텍스트는 논리적인 개념이다 (눈에 보이지 않으며, 엔티티매니저(필자 약칭 EM)을 통해서 접근) - J2EE, 스프링 프레임워크와 같은 컨테이너 환경에서는 EM과 영속성 컨텍스트가 다대일 관계 2. 엔티티 생명주기 엔티티의 생명주기는 4가지로 분류된다 - 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 - 영속(managed): 영속성 컨텍스트에 관리되는 상태 - 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태 - 삭제(remove..
-
스프링 핵심6 - 빈 생명주기 콜백 / 빈 스코프
- 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요 - ex: 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정 (실제로 네트워크에 연결하는 것은 아니고, 단순히 문자만 출력하도록)NetworkClient 는 애플리케이션 시작 시점에 connect() 를 호출해서 연결을 맺어두어야 하고, 애플리케이션이 종료되면 disConnect() 를 호출해서 연결을 끊음 public class NetworkClient { private String url; public NetworkClient() { System.out.prin..
-
스프링 핵심5 - 의존관계 자동 주입
- 의존 관계 주입은 생성자 주입 / 수정자 주입(setter 주입) / 필드 주입 / 메서드 주입 4가지의 방법이 존재. ( 생성자 주입 ) - 생성자를 통해서 의존 관계를 주입 받는 방법 - 생성자 호출시점에 딱 1번만 호출되는 것이 보장 - 불변, 필수 의존관계에 사용 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRep..
-
스프링 핵심4 - 컴포넌트 스캔
- 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공 - 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공 - 컴포넌트 스캔을 사용하려면 먼저 @ComponentScan 을 설정 정보에 붙임( AppConfig에 @Bean으로 등록한 클래스가 하나도 없음) @Configuration @ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public class AutoAppConfig { } - 컴포넌트 스캔을 사용하면 @Configuration 이 붙은 설정 정보도 자동..