일단 상품을 추가하려면 상품을 입력받은 페이지가 필요하다

대충 html 파일 하나 만들고

form 안에 인풋태그 두개(상품명, 가격)와 전송할 submit 버튼을 만들어준다

<form action="/add" method="POST">
    <input name="title">
    <input name="price">
    <button type="submit"></button>
</form>

 

action 은 어디로 보낼지

method POST 같은 경우는 서버로 데이터를 전송할 때 사용된다

 

@GetMapping("/write")
String write() {
    return "write.html";
}

또 컨트롤러로 상품을 추가하려는 페이지를 만들어준다

 

이제 form 태그안에 action으로 add로 보내기로 했으니

컨트롤러로 add 주소로 올 경우에 대해서 짜줘야한다

 

좌 : 컨트롤러, 우 : Item Entity

포스트 방식으로 바꿨으니 포스트 매핑으로 add 로 들어오는 것에 대하여

@RequestParam 으로 name 속성에 적어놓은 것들을 보낸다

 

Entity를 새로 생성해주고

그 안에다가 private으로 설정되있으니

setter를 통해 이름과 가격을 다시 설정해준다

 

그 후 repository에 내장되있는 save 함수를 통해

만들어놓은 Entity 객체를 통해 db에 저장해주고

 

redirect: 로 다시 주소로 보내준다


하지만 받아오는 변수가 여러개라면 ?

일일히 적는것도 일이다

그럴땐 Map 타입으로 변수들을 받아오면 된다

@PostMapping("/add")
String addPost(@RequestParam Map formData) {
    var item = new Item();

    item.setTitle((String)formData.get("title"));
    item.setPrice((Integer)formData.get("price"));

    itemRepository.save(item);
    return "redirect:/list";
}

타입은 Map으로 해주고 작명은 알아서 하면 된다

map.put("key", "value");

식으로 넣을 수 있고

map.get("key");

식으로 value 값을 꺼내올 수 있다

꺼내오는 값은 object 값으로

setTitle 에서 원하는 매겨변수는 String 값이기 때문에

타입캐스팅도 해준다


또또 더 간편하게 넣는 법이 있다

@PostMapping("/add")
String addPost(@ModelAttribute Item item) {

    itemRepository.save(item);
    return "redirect:/list";
}

 

@ModelAttribute 로 Item클래스 새로 생성하고

알아서 맞는곳에 다 집어넣어준다

위에 했던것들을 간편하게 줄여준다

 

'SpringBoot' 카테고리의 다른 글

상품 상세 페이지  (1) 2024.10.16
navbar 만들기 (th:fragment, th:replace)  (1) 2024.10.16
접근 권한 (access modifiers  (0) 2024.10.15
HTML에 서버데이터 넣기  (0) 2024.10.14
lombok + DB 데이터 출력  (0) 2024.10.14

하다보면 클래스나 변수명 앞에 public이라고 붙어있는 경우가 있다

 

public 말고도 여러개가 있는데

private

static

protected

알아보자

 

public 이란 다른 폴더내에서도 사용이 가능하다 어디에서도 사용가능, 다른 파일 x

 

private 은 어디에서도 사용이 불가능하다

 

static 같은 경우는 따로 클래스 생성을 안하고 클래스. 만으로도 사용이 가능하다

 

protected

는 상속받은 경우 혹은 같은 패키지 내부에서 사용이 가능하다

 

다른 패키지란 가정하에 상속받아서 사용!


근데 여기서 private은 뭐가 좋은지란 생각이 들 수 있다

안전하다

자세하게 설명하면 외부에서 객체에 대한 정보를 직접적으로 변경하지 못하게하고

잘못된 값이 설정되는것을 막아준다

그럼 private 은 어떻게 쓰나

 

이렇게 get 함수를 만들어 다른 곳에서 함수를 불러서 사용은 할 수 있다 (자동완성도 가능)

public Integer getId() {
    return id;
}

이렇게 만들어진다

또 이렇게 일일히 만드는게 귀찮다면

Lombok 문법으로 Getter 어노테이션을 만들어주면 생성된다

모든 변수에 Get 함수를 만들려면

클래스 위에도 가능

 

또 부르기만 뭐하나 수정도 해야될 수도 있다

Setter

public void setId(Integer id) {
    this.id = id;
}

 

받아오는 매개변수로 변수값을 설정할 수도 있다

여기서 또 private의 장점을 사용하는데

public void setTitle(String title) {
    if (title.length() < 255 ) {
        this.title = title;
    } else {
        return;
    }
}

 

이런식으로 로직을 짜놔서 잘못된 값이 들어오는것을 막아줄 수 있다

Setter도 Getter와 마찬가지로 Lombok문법으로 사용 가능

'SpringBoot' 카테고리의 다른 글

navbar 만들기 (th:fragment, th:replace)  (1) 2024.10.16
사이트 내에서 입력받은 상품 추가  (1) 2024.10.16
HTML에 서버데이터 넣기  (0) 2024.10.14
lombok + DB 데이터 출력  (0) 2024.10.14
테이블 생성 (Entity)  (2) 2024.10.13

만약 html에서 사용하려면

var result = itemRepository.findAll();
model.addAttribute("items", result);

 

전체 데이터를 보내고

<div class="card"}">
    <img src="https://placehold.co/300">
    <div>
        <h4 th:text="${items.get(0).title}"></h4>
        <p th:text="${item[2].price}"></p>
    </div>
</div>

타임리프 문법으로 채워넣을 수 있다

 

만약 쇼핑몰의 옷을 보여주는 이 div 들이 엄청 많아진다면

하나하나 일일히 치는것도 일이다

그래서 th:each 문이 있다

 

<div class="card" th:each="item : ${items}">
    <img src="https://placehold.co/300">
    <div>
        <h4 th:text="${item.title}"></h4>
        <p th:text="${item.price}"></p>
    </div>
</div>

th:each="작명할 이름 : ${model.addAttribute 할때 작명한 이름}"

리스트의 길이만큼 반복해서 생성해준다


또 Lombok에서 지원해주는 어노테이션이 있는데

기본적으로

var result = itemRepository.findAll();
System.out.println(result);

 

이렇게 출력시 데이터 덩어리

확인하기 어렵다

이럴 때

@Entity
@ToString
public class Item {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer id;
    @Column(length = 200)
    public String title;
    public Integer price;
}

@ToString 어노테이션을 달아놓을시 기본적으로 사용시 안에 들어있는 내용들이 나온다

System.out.println(result);

 

 

'SpringBoot' 카테고리의 다른 글

사이트 내에서 입력받은 상품 추가  (1) 2024.10.16
접근 권한 (access modifiers  (0) 2024.10.15
lombok + DB 데이터 출력  (0) 2024.10.14
테이블 생성 (Entity)  (2) 2024.10.13
서버와 Database 연결, JPA  (1) 2024.10.13

lombok을 사용하려한다

의존성 먼저 build.gradle에 추가

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

 

또 버튼을 눌러서 로드를 진행해주고 몇가지 설정이 필요하다

세팅을 눌러서

플러그인에 lombok 검색후 설치

검색에 annotation processors 에 체크해제 상태를 체크하고 적용


DB 입출력을 하려면 3단계가 필요하다

인터페이스로 만들어 놓은 Entity 테이블의 이름 Repository

Item이라고 만들어놓았으니 ItemRepository로 생성

 

public interface ItemRepository extends JpaRepository<Item, Integer> {

}

 

extends JpaRepositry를 하면 <>가 생길것이다

그 안에 Entity 클래스, Id의 타입값을 입력해준다

 

이제 이 데이터들을 사용할 컨트롤러에 레포지토리를 등록해준다

public class ItemController {

    private final ItemRepository itemRepository;

 

불러온다 빨간줄이 나올텐데 생성자가 없어서 그러니

@Controller
@RequiredArgsConstructor
public class ItemController {

 

@RequiredArgsConstructor 로 생성자를 자동 생성해준다

 

+이 Lombok 문법 없이는 어떻게 가져올까

마우스 우클릭 Generate 클릭

 

생성자(Constructor) 클릭

레포지토리를 위한 생성자를 만드니 OK

 

public ItemController(ItemRepository itemRepository) {
    this.itemRepository = itemRepository;
}

 

자동으로 생성된다

그럼 빨간줄도 사라질거다

근데 Lombok 문법 사용시 이런 귀찮은 일을 안하니까

그냥 쓰자

 

이제 레포지토리도 가져왔으니 변수에 저장을 해주고 .으로 메서드들을 확인해보면 많다

 

일단 findAll()로 모든 데이터들을 가져와보자

var result = itemRepository.findAll();
System.out.println(result);

 

확인을 위한 sout

Ctrl + F9 로 서버 재시작 후 확인

ListController 에 sout를 넣어놨으니 

http://localhost:8081/list에 접속시 콘솔에 나오게 된다

 

원하는 값은 셔츠, 7000 이런 형태로 가져오는건데

이게 또 리스트 형태로 가져온다

마우스 올려보면 확인 가능

 

리스트에는 기본적으로 get(index)로 하나에 값을 가져올 수 있는데

 

테이블에 있는 컬럼들 확인 가능

title로 해보면

 

'SpringBoot' 카테고리의 다른 글

접근 권한 (access modifiers  (0) 2024.10.15
HTML에 서버데이터 넣기  (0) 2024.10.14
테이블 생성 (Entity)  (2) 2024.10.13
서버와 Database 연결, JPA  (1) 2024.10.13
Azure (Database 호스팅)  (2) 2024.10.13

SQL 쿼리로 테이블을 생성안하고 자바내에서 클래스만으로 테이블을 생성할 수 있다

 

@Entity
public class item {
}

어노테이션으로 Entity를 선언시 이 클래스는 테이블이 된다

 

컬럼 생성같은 경우는

타입 컬럼명; 으로 생성 가능하다

@Entity
public class item {
    public Integer id;
    public String title;
    public Integer price;
}

여기서 Integer를 사용하는 이유는 Integer의 유용한 함수 사용(타입 변환, 사칙연산 등등)

+ JPA 강요?

 

여기서 구분용 고유번호가 필요하다

만약에 같은 가격, 이름까지 같아버리면 거기서 구별을 하기 위한 고유번호가 필요하다

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer id;

 

컬럼 위에 @Id 로 고유한 값 (primary key 느낌)

@GeneratedValue(strategy = GenerationType.IDENTITY) 는

컬럼 추가시 1씩 자동으로 증가하는 정수가 입력된다고 볼 수 있다 (시퀀스 같은 느낌같다)

 

또 생성한 컬럼들 앞에 전부

public이 붙어있는 걸 확인 할 수 있는데 나중에 자유롭게 Item.title 등 사용할 수 있게 하기 위함이다

private로 확실하게 다른곳에서 사용할 필요가 없는 컬럼들은 해줄 수 있는데

아직은 필요없으니 전부 public으로 해준다

 

제약조건 같은 경우는

컬럼위에 @Column()으로 부여가 가능하다

 

unique : 고유한 값

@Column(unique = true)
    public String title;

 

예를 들어 상품명이 겹치면 안된다는 상황이라면 unique를 부여해주면 된다

이쁜바지라는 상품명을 가진 컬럼이 존재할경우 이쁜바지로 또 추가시 DB저장시에 실패하고 에러가 난다

+ @Id 사용시 기본으로 unique가 추가적으로 부여된다

+ 기본값은 false로 설정되어 있다


 

String 값의 길이제한은 기본적으로 255자다

만약 긴 문자열을 저장하기 위해선

@Column(columnDefinition = "TEXT")
    public String title;

 

이렇게 부여시 최대 65,535 자까지 저장이 가능하다

 

또 length = 정수 로

원하는 길이만큼의 글자로 제한도 가능하다

@Column(length = 200)
    public String title;

무조건 값이 들어가있어야하는 상황이라면

@Column(nullable = false)
    public String title;

 

데이터가 비어있을 경우 저장을 막는다

+ @Id 에는 또 nullable 이 기본적으로 false 로 되어있다

'SpringBoot' 카테고리의 다른 글

HTML에 서버데이터 넣기  (0) 2024.10.14
lombok + DB 데이터 출력  (0) 2024.10.14
서버와 Database 연결, JPA  (1) 2024.10.13
Azure (Database 호스팅)  (2) 2024.10.13
상품목록페이지 구현 (Thymeleaf)  (1) 2024.10.13

Connection 더블클릭

create database shop;

나오는 콘솔창에 데이터베이스 샵을 생성

 

재생버튼 클릭후

Schemas 우클릭후 Reload

shop 이란게 생겼으면 

 

오타가 나거나 지우고 싶을시 drop

되돌리기 못하니 조심

drop database shop;

dbeaver 사용시

Databases 우클릭 후 Create New Database

다른거 안건들고 name만 설정

 

sql 편집기 쿼리문 작성으로 생성하고 싶을시

 

 

그렇다


실제로 데이터베이스를 클릭식으로 안하고 쿼리문으로 CRUD 하는게 보편적이기때문에

일단 라이브러리 또 추가

build.gradle에 들어간 후

runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

상단 : mysql 접속 도와주는 라이브러리

하단 : ORM 라이브러리 : java 코드로 데이터 입출력 가능 대신 입출력 속도가 조금 떨어짐

 

  • JPA: Java의 ORM 표준 명세.
  • Hibernate: JPA의 대표적인 구현체이자 가장 많이 사용되는 ORM 라이브러리.

지금 사용하는게 Hibernate 이다

 

 

의존성에 추가 그 후 나오는 버튼 클릭 후

applicationproperties 파일에 들어가서 추가를 다시 해줘야한다

 

spring.datasource.url=jdbc:mysql://호스팅받은곳엔드포인트주소/만든database이름
spring.datasource.username=DB접속아이디
spring.datasource.password=DB접속비번
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=update

 

위에 4줄은 DB 접속 관리

 

밑에 두줄은

spring.jpa.properties.hibernate.show_sql=true

DB 입출력 sql을 실행창에 출력 여부

spring.jpa.hibernate.ddl-auto=update

테이블 생성시 자동 반영

실제 서비스 운영할때는 none이 일반

 

저장하고 서버 실행

터미널 볼 때

HikarPool에 Start completed 나올 시 성공

 

'SpringBoot' 카테고리의 다른 글

lombok + DB 데이터 출력  (0) 2024.10.14
테이블 생성 (Entity)  (2) 2024.10.13
Azure (Database 호스팅)  (2) 2024.10.13
상품목록페이지 구현 (Thymeleaf)  (1) 2024.10.13
웹 페이지 (Controller)  (1) 2024.10.12

Azure 사이트 접속후 회원가입 카드등록후

검색창에 mysql 유동서버 클릭

 

접속후 유연한 서버에 

미리 프로비전된 IOPS 360 으로 고정 과금방지

 

나머지는 알아서 입력하고

서버 배포가 완료되었다면

설정 > 서버 매개변수 > require 검색 on > off

 

인텔리제이 유료버전은 탭에 보면 db를 확인가능하지만 무료버전일경우

플러그인 설치 필요

 

 

세팅 > 플러그인 > Database Navigator 검색후 설치후 재시작

왼쪽 탭을 보면 새로운 DB Browser가 생겼을거다

탭을 누르고 + 버튼 클릭

Host 부분은 

서버이름 부분 복붙, 포트는 변경안함

밑에 User, Password 는 입력했던 로그인 이름, 비밀번호

 

테스트 커넥션 후 석세스 나올시 확인 누르면 된다

하지만 플러그인 자체는 버그가 많다고 하니


구글에 dbeaver 검색후 다운로드

상단에 데이터베이스 > 새 데이터베이스 연결

서버호스트는 똑같이 Azure에 서버이름 복붙

유저네임 패스워드 동일 

완료

 

 

'SpringBoot' 카테고리의 다른 글

테이블 생성 (Entity)  (2) 2024.10.13
서버와 Database 연결, JPA  (1) 2024.10.13
상품목록페이지 구현 (Thymeleaf)  (1) 2024.10.13
웹 페이지 (Controller)  (1) 2024.10.12
class, constructor  (1) 2024.10.12

서버에서 데이터나 데이터베이스에서 데이터를 가져오는 html을 만들 때는 templates라는 폴더안에 만들어야한다

상품목록을 보여주는 list.html을 만들어주고

 

또 이번엔 관련된 컨트롤러들만 모아놓는 편이 편하니

new 자바 클래스로 새로 itemController 생성

@Controller
public class itemController {

    @GetMapping("/list")
    String list(Model model) {
        
        return "list.html";
    }
}

 

전에 만들어놓았던 컨트롤러와 똑같다

여기서 이제 타임리프를 의존성에 추가해줘야하는데

찾아보면 build.gradle 파일이 있다

들어가보면 의존성을 추가하는 공간이 있는데

 

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

 

추가

 

추가했다면

 

이런 버튼이 나올텐데 클릭 없다면 위에 검색에서 검색해서 load

라이브러리 새로 추가시 실행중인 서버를 종료하고 다시 시작해줘야한다

 

@Controller
public class itemController {

    @GetMapping("/list")
    String list(Model model) {
        model.addAttribute("name", "홍길동");
        return "list.html";
    }
}

이제 api 함수에 파라미터로 Model model 을 넣고

메서드 안에 model.addAttribute("작명", "전송할 데이터");

로 보내줄 수 있다 원래는 데이터베이스에 있는 데이터나 서버에 있는 데이터를 전송하는데

아직 모르니 하드코딩으로 홍길동이라는 값을 가진 name을 전송

 

사용 방법은 간단하다

<h4 th:text="${name}">바지</h4>

 

html 파일안에

나타낼 태그안에

<태그 th:text="${작명한 데이터 이름}">

이러면 바지에 방금 만들어준 홍길동이 나타나게 된다

 

 

'SpringBoot' 카테고리의 다른 글

서버와 Database 연결, JPA  (1) 2024.10.13
Azure (Database 호스팅)  (2) 2024.10.13
웹 페이지 (Controller)  (1) 2024.10.12
class, constructor  (1) 2024.10.12
변수, if, for, 함수  (0) 2024.10.12

+ Recent posts