본문 바로가기
728x90
반응형

웹개발109

클라우드컴퓨터 MySQL 계정 생성하고 사용하기 mysql -u root -p 입력하고 root로 로그인. SELECT User, Host FROM mysql.user; 로그인 후 이렇게 입력하면 생성된 계정들을 확인할 수 있다. 아래 명령어를 입력해서 새로운 사용자를 생성한다. 여기서 `new_user`는 새로운 사용자의 이름, `password_here`는 사용자의 비밀번호이다. CREATE USER 'new_user'@'%' IDENTIFIED BY 'password_here'; GRANT ALL PRIVILEGES ON *.* TO 'new_user'@'%'; FLUSH PRIVILEGES; spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://{클라우.. 2023. 11. 10.
네이버 클라우드 서버 생성 서버 생성 네이버 클라우드 가입시 Micro서버가 1년간 무료이다. Micro 서버로 서버를 생성해보자. OS는 우분투, 서버타입은 Micro를 선택했다. 서버 이름 설정. (설정 안 해도 자동으로 생성된다) 인증키 이름을 적고 인증키 생성 및 저장 버튼을 눌러서 .pem 파일을 다운받는다. ACG설정. 이대로 생성했다. 공인IP 신청 Public IP로 들어가서 신청. 서버 포트포워딩 설정 포트 포워딩 설정을 클릭, 외부 포트로 사용할 번호를 입력하고 저장한다. 1024~49151 사이의 숫자를 임의로 정하면 됨. ACG설정 ACG설정에 들어가서 접근 소스와 허용포트를 작성. 접근소스는 전체 접근 허용을 하려면 0.0.0.0을 적으면 됨. 허용 포트는 아까 설정한 외부 접속 포트번호, 백엔드 포트번호,.. 2023. 9. 7.
ngrok CORS 해결하기 ngrok으로 팀원들과 api 테스트를 해보는데, CORS 에러가 발생했다. @Configuration @EnableWebMvc public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .allowCredentials(true) .maxAge(3600); } } 백엔드에서 CORS를 모두 허용했음에도 불구하고 CORS에러가 여전히 나타났.. 2023. 8. 17.
ngrok: 로컬 서버를 인터넷에 공개하기 Springboot 프로젝트를 만들고 있는데, 프론트엔드 팀원이 api 테스트를 해보고싶다고 하는 상황이다. 하지만 아직 클라우드 서버는 준비가 되지 않았고, 팀원이 Springboot 프로젝트를 내려받아서 실행시키기는 시간이 오래 걸릴 것 같다. 이런 상황에서 ngrok을 활용하여 내 로컬 서버를 인터넷에 공개하고, 팀원들은 공개된 내 로컬서버에 접근하여 테스트를 할 수 있도록 했다.(ngrok은 외부에서 내 로컬 서버에 접근할 수 있는 퍼블릭 URL을 제공하는 도구이다) ngrok 사용 방법 1. 회원가입 https://ngrok.com/ ngrok How it Works ngrok delivers instant ingress to your apps in any cloud, private networ.. 2023. 8. 15.
파일 업로드 구현하기 게시물 작성시 파일을 업로드할 수 있게 하고, 게시물 조회시 업로드한 파일을 보고, 다운로드받을 수 있도록 해보자. 1. 파일 업로드 화면 만들기 ... Upload save 게시물 작성 화면에 파일 업로드 input을 생성한다. ``` 2023. 7. 27.
네이버 검색 API를 이용하기 외부 API를 이용해보는 경험을 쌓고자 백과사전 검색기능을 프로젝트에 추가해보기로 했다. 네이버 검색(백과사전) API를 이용해서, 검색어를 입력하면 검색결과를 보여주도록 만들어보자. 사전 준비 https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EB%B8%94%EB%A1%9C%EA%B7%B8 검색 > 블로그 - Search API 검색 > 블로그 블로그 검색 개요 개요 검색 API와 블로그 검색 개요 검색 API는 네이버 검색 결과를 뉴스, 백과사전, 블로그, 쇼핑, 영화, 웹 문서, 전문정보, 지식iN, 책, 카페글 등 분야별로 볼 수 developers.naver.com 위 링크로 접속해서, API 이용방법을 숙지. (로그인 후 이용.. 2023. 7. 26.
검색 기능 적용하기 게시물을 제목으로 검색할 수 있는 기능을 만들어본다. (페이징 적용) 검색 기능 적용하기 1. Repository public interface ArticleRepository extends JpaRepository { ... Page findByTitleContaining(String keyword,Pageable pageable); } JpaRepository를 상속받는 레파지토리 인터페이스에, findBy{필드명}Containing({타입} 검색어) 형식으로 메소드를 작성한다. 나는 Article엔티티에 String타입의 title이 있고, 이 title을 이용해서 검색할것이기 때문에 findByTitleContaining(String keyword) 로 작성했다. 그럼, title필드에 keywo.. 2023. 7. 26.
페이징 기능 적용하기 예전에 혼자 만들던 프로젝트에 페이징기능과 검색기능을 추가해보기로 했다. (1로 표시해놓은 페이지 전환버튼까지 적용함. 2번은 게시물 검색기능인데 이건 다음 글에서...) 페이징 1. Repository public interface ArticleRepository extends JpaRepository { ... Page findAll(Pageable pageable); } JpaRepository를 상속받는 레파지토리 인터페이스에서, 메소드 파라미터로 Pageable을 넣으면 Page로 엔티티를 반환받을 수 있다. Pageable은 SpringDataJPA에서 제공하는 인터페이스로, 페이지 번호, 페이지 크기, 정렬 기준 등의 정보를 가지고 있다. Page는 SpringDataJPA에서 제공하는 인터.. 2023. 7. 26.
JPQL JPQL(Java Persistence Query Language) 기본 문법과 기능 JPQL은 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL로 변환된다. select m from Member as m wehere m.age > 18 기본적인 문법은 SQL과 거의 동일하다. 유의할 점 - 엔티티와 속성은 대소문자를 구분한다. - 테이블 이름이 아닌 엔티티 이름을 사용한다. - 별칭이 필수이다. TypeQuery: 반환 타입이 명확할 때 Query: 반환 타입이 명확하지 않을 때 TypedQuery query = em.createQuery("select m from Member m", Member.class); TypedQuery query1 = em.createQuery("select m.usern.. 2023. 7. 22.
JPA가 지원하는 다양한 쿼리 방법 JPA는 다양한 쿼리 방법을 지원한다. JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발하는데, 검색을 할때도 테이블이 아닌 엔티티 객체를 대상으로 검색할 수 있어야한다. 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능하므로 결국 검색 조건이 포함된 SQL이 필요하다. JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. SQL과 문법이 유사하지만 JPQL은 엔티티 객체를 대상으로 쿼리하고, SQL은 데이터베이스 테이블을 대상으로 쿼리한다는 점이 다르다 JPQL은 객체 지향 SQL이라고 말할 수 있다. List resu.. 2023. 7. 22.
chatgpt api를 이용해보다 https://platform.openai.com/docs/libraries/community-libraries OpenAI Platform Explore developer resources, tutorials, API docs, and dynamic examples to get the most out of OpenAI's platform. platform.openai.com 여기 openAI 홈페이지에서 api사용법이랑 다 나와있다. 라이브러리도 많이 나와있는데, https://github.com/TheoKanning/openai-java GitHub - TheoKanning/openai-java: OpenAI Api Client in Java OpenAI Api Client in Java. Contr.. 2023. 7. 20.
[Springboot] Jsoup라이브러리를 이용하여 크롤링하기 크롤링해서 현재 날씨와 기온을 가져와보자.. (아래 문장은 chatgpt api를 이용해서 만든건데.. 현재 서비스중인 chatGPT3.5보다 더 형편없는듯한 답변이..) //크롤링 implementation 'org.jsoup:jsoup:1.15.3' 크롤링을 위해 jsoup 라이브러리를 사용한다. build.gradle 파일에 dependencies에 위 코드를 추가한다. @Getter @Builder public class Weather { private String condition; private String temperature; } 날씨와 온도 정보를 저장하기 위해서 Weather클래스를 정의했다.(예시) 그리고 WeatherService라는 서비스 클래스를 만들었고, getWeather메소.. 2023. 7. 20.
값 타입 JPA는 데이터 타입을 엔티티 타입과 값 타입으로 분류한다. 엔티티 타입은 @Entity로 정의한 객체 엔티티의 속성이 변경되면 식별자(id)로 인식 가능함 ==> 데이터가 변경돼도 식별자로 추적 가능 값 타입은 int, Integer, String같은 기본타입 식별자가 없고 값만 있으므로 변경시 추적불가 값 타입의 분류 기본값타입 임베디드 타입 컬렉션 값 타입 기본값타입 자바 기본 타입(int, double), 래퍼 클래스(Integer,Long), String 생명주기를 엔티티에 의존함. 값 타입은 공유하면 안됨.(만약 회원1과 회원2가 속성으로 값타입을 공유하면 회원1이 속성을 변경했을 때 회원2도 같이 적용되겠지) (근데 래퍼클래스, String등은 변경이 불가능하기때문에 문제없음) 임베디드 타입.. 2023. 7. 19.
영속성 전이 CASCADE Cascade 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들고싶을 때 사용한다. (부모 엔티티 저장시 자식 엔티티도 함께 저장) @Entity class Parent{ ... @OneToMany(mappedBy="parent") private List childList; void addChild(Child child){ this.childList.add(child); child.parent=this; } } @Entity class Child{ @ManyToOne private Parent parent; } Parent, Child 클래스가 있다고 하자. Child child1=new Child(); Child child2=new Child(); Parent parent=new.. 2023. 7. 19.
즉시 로딩과 지연 로딩 Member와 Team이 연관관계로 묶여있다고 할 때, Member를 조회할 때 Team도 조회해야할까? 프록시 개념 필요 2023.07.14 - [JPA] - 프록시 지연 로딩 @Entity public class Member { ... @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="TEAM_ID") private Team team; ... } FetchType.LAZY로 설정하면 프록시로 조회하게 된다. 예를들어 멤버1을 조회하면, 멤버1객체를 가져오고, 멤버1과 관련된 team은 프록시로 가져온다. 이후, team의 속성을 사용하는 시점에 프록시 객체가 초기화되면서 쿼리가 발생하고 team객체를 가져오게 된다. Member와 Team이 가끔씩만 함께 .. 2023. 7. 16.
프록시 em.find() vs em.getReference() em.find는 DB를 통해 실제 엔티티 객체를 조회 em.getRefrence()는 DB조회를 미루는 가짜(프록시)엔티티 객체 조회 프록시? 실제 클래스를 상속받아 만들어져서 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용해도 됨(이론상) 프록시 객체는 실제 객체의 참조 target을 보관하고 있음. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출함. 프록시 객체를 통해 메소드를 호출하면 다음과 같은 순서로 프록시 객체 초기화가 이루어진다. 1. 프록시 객체의 메소드를 호출 2.영속성 컨텍스트에 초기화 요청 3. 영속성 컨텍스트는 DB를 조회하여 실제 객체를 찾음. 4. 조회한 .. 2023. 7. 14.
@MappedSuperclass 공통 매핑 정보가 필요할 때 사용할 수 있다. MappedSuperclass 어노테이션이 적용된 클래스는 엔티티로 직접 매핑되지 않으며, 데이터베이스 테이블로 생성되지 않는다. 대신, MappedSuperclass 어노테이션이 적용된 클래스를 상속하는 하위 클래스에서 해당 클래스의 속성과 매핑 정보를 상속받아 사용할 수 있다. MappedSuperclass로 지정된 클래스는 공통적으로 사용되는 속성이나 매핑 설정을 정의할 수 있다. 예를 들어, 여러 엔티티 클래스에서 공통적으로 사용되는 생성일자(createdDate)와 수정일자(modifiedDate)를 MappedSuperclass 클래스에 정의하고, 해당 클래스를 상속받는 엔티티 클래스에서는 추가적인 속성만 정의하여 사용할 수 있다. MappedSu.. 2023. 7. 7.
상속관계 매핑 관계형 데이터베이스에서 상속 관계를 구현하는 전략은 주로 다음과 같이 세 가지 방법이 사용된다. 1. 조인 전략 (Join Strategy): 조인 전략은 각각의 서브타입에 해당하는 테이블을 별도로 생성하고, 슈퍼타입과 서브타입 간의 관계를 조인을 통해 맺는 방식이다. 이 전략에서는 슈퍼타입과 서브타입의 속성을 각각의 테이블에 저장하며, 서브타입 객체를 조회할 때 조인을 사용하여 필요한 정보를 가져온다. 이 방식은 데이터베이스 정규화를 지원하며, 서브타입의 추가나 삭제가 용이하다. 하지만 매번 조인이 필요하기 때문에 성능에 영향을 줄 수 있다. 저장공간은 효율화되지만 쿼리가 복잡하다. @Entity @Inheritance(strategy=InheritanceType.JOINED) @Discrimiator.. 2023. 7. 7.
swagger 작성해보기, Springboot swagger 연동하기 Swagger는 API명세 문서를 작성하는데 도움을 주는 도구이다. https://app.swaggerhub.com/home Build, Collaborate & Integrate APIs | SwaggerHub app.swaggerhub.com 여기서 회원가입 후, create버튼을 눌러 새 문서를 작성할 수 있다. 템플릿 없이 문서를 생성하면 이런 기본 창이 뜬다. https://jsonplaceholder.typicode.com/ JSONPlaceholder - Free Fake REST API {JSON} Placeholder Free fake API for testing and prototyping. Powered by JSON Server + LowDB. Tested with XV. Servi.. 2023. 7. 5.
다양한 연관관계 연관관계 매핑시 고려사항 다중성 단/양방향 연관관계의 주인 다중성 @ManyToOne @OneToMany @OneToOne @ManyToMany (이 중 다대다는 실무에서 쓰지 않는다.) 단방향과 양방향 테이블은 외래키 하나로 양쪽 조인 가능(사실상 양방향) 그러나 객체는 참조용 필드가 있어야 참조가능하다. 한쪽만 참조하면 단방향, 양쪽 서로 참조하면 양방향이다.(사실 각각 단방향인것이긴 하지만..) 연관관계의 주인 테이블은 외래 키가 하나인데, 객체 양방향 관계는 참조가 두군데 있다. 둘 중 테이블의 외래 키를 관리할 곳을 지정해야한다. 연관관계의 주인은 외래키를 관리할 수 있고, 주인의 반대편은 단순 조회만 가능하며 값을 관리할 수 없다. 다대일 이전 포스트를 참고. 다(Many)가 연관관계의 주인이.. 2023. 7. 3.
728x90
반응형