url에서 값을 가져올 때

function getUrlParams(){
    const params = {};

    window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi,
        function(str, key, value){
            params[key] = value;
        }
    );

    return params;
}
 
 

https://summernote.org/

 

Summernote - Super Simple WYSIWYG editor

Super Simple WYSIWYG Editor on Bootstrap Summernote is a JavaScript library that helps you create WYSIWYG editors online.

summernote.org

 

정규식 img src 추출

 

php폴더의 php.ini에서 post_max_size로 전체 보내는 용량 설정

upload_max_filesize=40M 로 file타입의 용량
memory_limit=512M 메모리 용량
수정한 후에 apache를 멈췄다가 다시 실행
 
in_array($ext, $not_allowed_file_ext) 앞에있는 값에 뒤에있는 값이 존재하는가를 판별
       
 
$where = " WHERE bcode=:bcode ";
        if(isset($paramArr['sn']) && $paramArr['sn'] != '' && isset($paramArr['sf']) && $paramArr['sf'] !=''){
            switch($paramArr['sn']){
                case 1: $where = "AND (subject LIKE CONCAT('%', :sf, '%')) "; break;
                case 2: $sn_str = 'id'; break;
                case 3: $sn_str = 'email'; break;
            }
            $where .= $sn_str."=:sf ";
        }

subject LIKE='%{$sf}%'로 하면 sql injection공격을 받을 수 있기 때문에사용하면 안됨

공통부분 따로 분리 위치 값이 다를 때 처음부터 정의해줌. 

참고자료 php회원사이트만들기 #35

date('His') 계속 변하는 값

 

CREATE TABLE board_manage(
idx INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) DEFAULT '' COMMENT '게시판 이름',
`btype` ENUM('board', 'gallery') DEFAULT 'board' COMMENT '게시판 타입',
`cnt` INTEGER DEFAULT 0 COMMENT '게시물 수',
`create_at` DATETIME,
PRIMARY KEY(idx)
);

enum은 둘중 하나로 한정지어서 

 

index를 사용할 때의 

장점 검색속도가 빨라짐

단점 insert, delete, update속도가 느림

용량이 좀 증가

 

속도가 늦어질 때 중복해서 게시판이 여러개 생성될 수 있다. 

F12 네트워크 NO throttling에서 slow 3g로 변환하면 느린 속도로 바뀐다.

 

    btn_board_create.addEventListener("click",()=>{
        if(board_title.value==""){
            alert('게시판 이름을 입력해 주세요.');
            board_title.focus()
            return false
        }

        btn_board_create.disabled = true;

        const xhr = new XMLHttpRequest()

        const f = new FormData()
        f.append('board_title',board_title.value)
        f.append('board_type',document.querySelector("#board_type").value)
        f.append('mode','input')

        xhr.open("POST", "./pg/board_process.php", true);
        xhr.send(f);

        xhr.onload = ()=>{
            if(xhr.status == 200){
                const data = JSON.parse(xhr.responseText);
                if(data.result == 'mode_empty'){
                    alert('mode값이 누락되었습니다.');
                    return false;
                }else if(data.result=='title_empty'){
                    alert('게시판 명이 누락되었습니다.');
                    board_title.focus();
                    return false;
                   
                }else if(data.result=='btype_empty'){
                    alert('게시판 타입이 누락되었습니다.');
                    return false;
                }else if(data.result == 'success'){
                    alert('게시판이 생성되었습니다.');
                    self.location.reload();
                }
            }else{
                alert('통신 실패'+xhr.status);
            }
        }
    })
 
click하고 버튼 disabled처리

fileimage를 넣을 때 태그 안에 multiple을 넣으면 여러장을 넣을 수 있다.

 

단방향 암호화

//회원 정보 입력
    public function input($marr){

        //단방향 암호화
        $new_hash_password = password_hash($marr['password'], PASSWORD_DEFAULT);

        $sql = "INSERT INTO member(id, name, password, email, zipcode, addr1, addr2,photo, create_at, ip) VALUES
        (:id, :name, :password, :email, :zipcode, :addr1, :addr2,:photo, NOW() ,:ip)";

        $stmt = $this->conn->prepare($sql);
        $stmt -> bindParam(':email', $marr['email']);
        $stmt -> bindParam(':id', $marr['id']);
        $stmt -> bindParam(':name', $marr['name']);
        $stmt -> bindParam(':zipcode', $marr['zipcode']);
        $stmt -> bindParam(':password', $new_hash_password);
        $stmt -> bindParam(':addr1', $marr['addr1']);
        $stmt -> bindParam(':addr2', $marr['addr2']);
        $stmt -> bindParam(':photo', $marr['photo']);
        $stmt -> bindParam(':ip', $_SERVER['REMOTE_ADDR']);
       

        $stmt->execute();

    }
 

 

//로그인
    public function login($id, $pw){

        //password_verify($password, $new_password);

        $sql = "SELECT password FROM member WHERE id=:id";
        $stmt = $this->conn->prepare($sql);
        $stmt->bindParam(':id',$id);
        $stmt->execute();

        if($stmt->rowCount()){
            $row = $stmt->fetch();

            if(password_verify($pw, $row['password'])){
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }

        return $stmt->rowCount() ? true:false;

    }

}

 

 

 


    const login = document.querySelector("#login");
    if(login) {
  login.addEventListener("click",()=>{
    self.location.href="./login.php"
  })
}
if로 존재여부를 파단한 후에 사용.

 

 

ALTER TABLE `member` ADD COLUMN LEVEL TINYINT UNSIGNED DEFAULT 1;

  • TINYINT: 데이터 타입을 지정합니다. TINYINT는 매우 작은 정수를 저장할 수 있는 데이터 타입으로, MySQL에서는 -128에서 127까지의 범위를 가집니다. UNSIGNED 키워드가 사용되면 범위가 0에서 255까지가 됩니다.
  • UNSIGNED: 이 키워드는 해당 열이 음수 값을 저장하지 않음을 나타냅니다. UNSIGNED로 선언된 TINYINT는 0에서 255까지의 양의 정수만 저장할 수 있습니다.

레벨을 부여하여 관리자와 사용자를 나눔.

 

 

        //fetch는 하나만 가져오고 fetchAll은 여러개를 가져옴.
        return $stmt->fetchAll();
 
   //회원관리
    public function list(){
        $sql = "SELECT * FROM member";
        $stmt = $this->conn->prepare($sql);
        $stmt->setFetchMode(PDO::FETCH_ASSOC);  //필드명으로 된 형태만 나옴.
        $stmt->execute();

        //fetch는 하나만 가져오고 fetchAll은 여러개를 가져옴.
        return $stmt->fetchAll();
    }
 

HTML, CSS, JAVASCRIPT는 웹브라우저에서 동작하는 스크립트 언어.

PHP는 웹서버에서 동작하는 언어로 데이터베이스 등과 연동되어 회원관리, 게시판 등의 기능을 만드는데 사용가능.

 

Xampp프로그램

Apache + PHP +MariaDB 프로그램을 한번에 설치

 

Apache config(httpd.conf)에 Listen에 포트 번호 변경 가능

localhost:포트번호 => localhost:포트번호/dashboard

연결가능

 

C:\xampp\htdocs vscode에서 폴더 선택

control+, = 설정

설정 > php > settings.json

php.exe의 경로 설정
 "php.validate.executablePath": "C:\\xampp\\php\\php.exe"
 

확장에서 PHP Intelephense 설치

 

 

<?php
echo "333"
?>
 
화면에 333이 나옴
 

 

php기초 문법, 변수 표기법, 주석처리, 자바스크립트와 차이

<?php
이 안에다 구문 작성
?>

 

!+tab해서 html로 바꿈

    <?php
    echo "안녕하세요";
    ?>

문장이 끝난 후 반드시 ;

마지막에서는 빼도 되지만 그래도 쓴다라고 생각

    //변수
    $a =1;

변수에 $사인

let, const는 없음.

주석은 자바스크립트와 동일

 

 

변수의 범위, 지역변수, 글로벌 변수

php같은 경우 소스 보기를 해도 주석으로 처리된 내용이 보이지 않지만 (서버사이드 언어, 보안상 좋음) html의 경우 주석으로 처리된 내용이 보인다.

 

<?php
//xampp
/*웹서버, DB서버, PHP
Apache, Mariadb, PHP컴파일러
php.net*/

$txt="PHP";
echo "I LOVE $txt !";

#80포트 시 localhost만 입력해주면 된다.http://localhost/ = index.php

$txt1 = "안녕하세요";   //문자열
$x = 5; //정수
$y=10.5; //실수
$X=10;  

//변수는 대소문자를 구분한다.
echo "x= $x, X= $X";

//전역변수
//로컬변수(지역변수)

$x=5;

function myTest(){
    echo "변수 x의 출력값 $x";
    echo "<br>";
}

myTest();

echo "변수 x의 출력값 $x";
 
 

전역변수의 범위

 

function myTest(){
    global $x;
    echo "변수 x의 출력값 $x";
    echo "<br>";
}
 
global(전역변수)로 정의 해주면
 
I LOVE PHP !x= 5, X= 10변수 x의 출력값 5
변수 x의 출력값 5
 
제대로 출력
 
    $x++; 1증가
 
 
 
출력함수, 문자열 길이, 문자열 뒤집기, 문자열 찾기
<?php

echo "1";
print "2";

echo("3");
print("4");


?>
 
echo와 print는 동일함

 

 

<?php

echo "1";
print "2";

echo("3");
print("4");

echo "<h2>PHP는 재밌다.</h2>";
echo "Hello World! <br>";
echo "I'm about to learn PHP!<br>";


$txt1="Learn PHP";
$x=5;
$y=4;

//문자열 연결 연산자로 .사용
echo "<h2>".$txt1."</h2>";
echo $x+$y."<br>";

//var_dump로 형을 알수 있음.
$x1=3333;
var_dump($x);

$x2="한글"; //6bytes
var_dump($x2);

//문자열 bytes반환
$x_len = strlen("한글");
echo $x_len."<br>";

//단어 수 세기 한글x
echo str_word_count("hello world")."<br>";

//문자열 뒤집기
echo strrev("hello world")."<br>";

//위치 0부터 count, 보통 email @
$a = strpos("hello world", "world")."<br>";
echo $a;

$email = "aaa.gmail.com";

if(strpos($email,"@")){
    echo "이메일 형식에 맞음.";
}else{
    echo "이메일 형식이 잘못됨.";
}

?>
 

 

<?php

$str = "나는 자랑스러운 미국인이다.";

//str_replace("바꿀문자열","바뀔문자열","대상문자열");
$str1 = str_replace("미국인", "한국인",$str);
echo $str1."<br>";

//is_int 정수, is_float 실수
//is_numeric
//"3"일 때는 정수가 아닙니다로 나옴.
$x = 3;

var_dump(is_int($x));
if(is_int($x)){
    echo "x는 정수입니다."."<br>";
}else{
    echo "x는 정수가 아닙니다."."<br>";
}

//"3"도 숫자로 판단
$x2="3";

if(is_numeric($x2)){
    echo "숫자입니다."."<br>";
}else{
    echo "숫자가 아닙니다."."<br>";
}

echo(pi())."<br>";

echo(max(0,1,2,333,12,1));
?>
 
 

 

난수발생, 반올림, 절대값, 루트값, 상수, 파이

 

<script>
    const GREETING="안녕하세요!<br>"
    document.write(GREETING)

</script>


<?php
//abs() 절대값
$a=-33;
$b=abs($a);


//sqrt() 루트
$b1=sqrt(4);
echo $b1."<br>";

//round 반올림
$a2 = -2.75;
$b=round($a);
echo $b."<br>";

//rand() 난수 , 범위
$a3=rand(10,12);

echo $a3."<br>";

//define()

define("GREETING","안녕하세요");

//상수는 변경할 수 없음.
//Parse error: syntax error, unexpected token "=" in C:\xampp\htdocs\4.php on line 33
//GREETING="DDD";

echo GREETING."<br>";
?>
 

 

연산자

 

<?php
//PHP산술 연산자 +- /* 나머지 % **제곱
$a=2**3;
echo $a."<br>";


//php할당 연산자
$b = 5;
$a1 = $b;
$b--;
echo $b."<br>";


$y=10;
$x=5;

$x+=$y; //$x= $x+$y;

echo $x."<br>";


//비교 연산자 문자열과 숫자를 같게 판단
$a2 = 10;
$b2= "10";

if($a2 == $b2){
    echo "a2와 b2는 같다."."<br>";
}else{
    echo "a2와 b2는 다르다"."<br>";
}


$a3 = 10;
$b3= "10";

if($a3 === $b3){
    echo "a3와 b3는 같다."."<br>";
}else{
    echo "a3와 b3는 다르다"."<br>";
}

//!= 과 <>는 동일
var_dump($a3 != $b3);


//증감연산자 ++,--

//논리 연산자
//and, or, xor, &&, ||, !

$x=true;
$y=true;

//논리곱
var_dump($x and $y); //1*1 = 1
var_dump($x && $y); //1*1 = 1


$x=true;
$y=false;
var_dump($x and $y); //1*0=0


//논리합
var_dump($x or $y); //둘 중 하나만 true여도 true
var_dump($x || $y); //둘 중 하나만 true여도 true


//xor
var_dump($x xor $y); //두 개의 값이 다를 때 true 같을때 false

//문자열 연산자

$a="안녕";
$a .="하세요";

echo $a;
?>
 
 

<script>
    const arr1 = ["자동차", "비행기","요트"];
    const arr2 = [...arr1];

    arr1.pop();

</script>


<?php
//내장함수
//사용자 정의함수

/*
$money=3000;
//3번째 자리 ,
echo number_format($money);

function getString(){
    echo '구문';

    return 3;
}

$a = getString();

echo $a;

function addNumber($a, $b){
    return $a+$b;
}

echo "<h2>" . addNumber(3,5) . "</h2>";
echo "<h2>" . addNumber(13,5) . "</h2>";
echo "<h2>" . addNumber(3,15) . "</h2>";
echo "<h2>" . addNumber(23,5) . "</h2>";
*/
//declare 맨 처음에 정의되어야한다. 타입 제한
//declare(strict_types=1);

function addNumber1(int $a, int $b) : int{
    return $a+$b;
}

$c = addNumber1(5,4);
echo $c;

//배열
$car = array("자동차", "비행기", "요트");
$car2 = $car;

$car2[0] = "비행선";

print_r($car2);
print_r($car);


//print_r($_SERVER);

echo $_SERVER['PHP_SELF'];

$ag = $_SERVER['HTTP_USER_AGENT'];

if(strpos($ag, 'Chrome')){
    echo '크롬 유저시군요';
}else{
    echo '크롬 유저가 아니시군요';
}


echo "당신의 IP는 ".$_SERVER['REMOTE_ADDR']."입니다.";

print_r($_GET);

echo "name : ".$_GET['name'];
echo "<br>";
echo "company:".$_GET['company'];


echo "name : ".$_REQUEST['name'];
echo "<br>";
echo "company:".$_REQUEST['company'];

print_r($_POST);
print_r($_REQUEST);


?>

<a href="<?=$_SERVER['PHP_SELF']; ?>?a=b">b값을 가져오기</a>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form method="post" action="6.php" autocomplete="off">

        이름: <input type="text" name="name"><br>
        회사: <input type="text" name="company">
        <button>전송</button>
    </form>
</body>
</html>

테이블 간의 관계 추가

Car테이블과 일대다 관계에 있는 Owner라는 새 테이블을 추가해보자. 여기서 일대다 관계라는 것은 소유자 한명이 자동차 여러대를 가질 수 있지만 한 자동차의 소유자는 한명이라는 뜻이다. 

먼저Owner엔티티와 리포지터리를 만듦. 

 

일대다 관계를 추가하려면 @ManyToOne 및 @OneToMany 어노테이션을 이용한다. Car 엔티티 클래스에서는 @ManyToOne 어노테이션으로 관계를 정의.

 

RESTful 웹 서비스 만들기

스프링 부트에서 모든 HTTP 요청은 컨트롤러 클래스로 처리. RESTful 웹 서비스를 만들려면 먼저 컨트롤 클래스를 만들어야 한다. 

 

스프링 데이터 REST(Spring Data REST)는 스프링 데이터 프로젝트의 일부 이며 스프링으로 쉽고 빠르게 RESTful 웹 서비스를 구현할 수 있게 해준다. 스프링 데이터 REST를 이용하려면 다음 의존성 추가.

<!--rest 의존성-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-rest</artifactId>

</dependency>

 

application.properties 파일에서 서비스의 엔드포인트(API가 서버셍서 리소스에 접근할 수 있도록 가능하게 하는 URL)를 정의할 수 있다.

#스프링 데이터 RESTful setting

spring.data.rest.basePath=/api

'spring, springboot' 카테고리의 다른 글

게시판이 여러 이미지를 가지고 있을 때,JPA  (0) 2023.09.13
BoardDao와 BoardService 인터페이스의 차이  (0) 2023.09.06
springBoot file  (0) 2023.09.05
스프링 부트 api  (0) 2023.09.04
Model  (0) 2023.08.24

이미지는 게시판에서만 쓸때 이미지 service를 따로 만들 필요 없이 imageVO와 ImageDao, Image.xml만 만듦.

게시판은 이미지를 가지고 있다.

public class multipleBoardVO extends CommonVO{

 

private List<ImageVO> images;

 

https://start.spring.io/

로 외부에서 프로젝트를 만들 수 있다.

 

@EnableAutoconfiguration: 스프링 부트 자동 구성을 활성화. 

@ComponectScan: 스프링 부트 컴포넌트 검색으로 애플리케이션의 모든 컴포넌트를 찾음.

@Configuration: 빈 정의의 원본으로 쓸 수 있는 클래스를 정의.

 

 

ORM, JPA,하이버네이트

ORM: 데이터를 객체지향 패러다임으로 조작하고 데이터를 검색하는 기술.

데이터 베이스 구조보다는 객체지향 개념에 기반을 두고 있어 개발 속도를 높이고 소스코드의 양이 줄어든다.

ORM을 사요하면 데이터베이스로부터 거의 독립적인 코드 작성이 가능하며 사용하는 DBMS에 따라 조금씩 달라지는 SQL문에 관해 개발자가 걱정할 필요가 없다.

 

 

JPA: 자바 개발자를 위한 객체-관계형 매핑을 제공. JPA엔티티는 데이터베이스 테이블 구조를 나타내는 자바 클래스. 엔티티 클래스의 필드는 데이터 베이스 테이블의 열을 나타낸다.

 

하이버네이트: 가장인기 있는 JPA구현체이고 스프링부트에서 기본 구현체로 활용된다. 

 

엔티티 클래스 만들기

엔티티 클래스: JPA의 @Entity 어노테이션을 사용하는 자바클래스. 엔티티 클래스는 표준 자바 빈의 명명 규칙을 따르며 적절한 getter와 setter를 가진다. 클래스 필드의 가시성은 private로 설정된다.

JPA: 애플리케이션이 초기화 될 때 클래스 이름으로 데이터베이스 테이블을 만든다. 데이터베이스 테이블에 다른 이름을 지정하려면 엔티티 클래스에서 @Table어노테이션을 이용하면 된다. (클래스 이름이 테이블명이 된다.)

 

메서드가 한 항목만 반환할 때는 T 대신 Optional<T>를 반환. 

Optional: 값을 포함하거나 포함하지 않은 단일 값 컨테이너. 값이 있으면 isPresent()메서드가 true를 반환하고 없으면 false를 반환.값이 있으면 get()메서드로 값을 구할 수 있다.

 

스프링 데이터 리포지터리에 쿼리를 정의할 수 있다. 쿼리는 접두사(findBy)로 시작해야하고 그 다음에 쿼리에 이용할 엔티티 클래스 필드가 나와야한다. like가 아니라 일치하는 값.

findByBrand, findByColor, findByYear

 

'spring, springboot' 카테고리의 다른 글

jpa  (0) 2023.09.14
BoardDao와 BoardService 인터페이스의 차이  (0) 2023.09.06
springBoot file  (0) 2023.09.05
스프링 부트 api  (0) 2023.09.04
Model  (0) 2023.08.24

 

  1. BoardDao 인터페이스:
    • DAO는 "Data Access Object"의 약자로, 데이터베이스와 직접 상호작용하는 역할
    • 주로 데이터베이스에서 데이터를 조회, 삽입, 업데이트, 삭제하는 메서드를 선언
    • 데이터베이스 연결 및 SQL 쿼리 실행과 관련된 로직을 포함
    • 데이터베이스 테이블과의 직접적인 상호작용을 담당하므로, 데이터 액세스 레이어의 역할을 수행
  2. BoardService 인터페이스:
    • Service는 비즈니스 로직을 정의하고 이를 실행하는 역할
    • 비즈니스 로직은 데이터베이스 조작 이외의 업무 로직, 예를 들어 데이터의 가공, 검증, 트랜잭션 관리 등을 포함
    • 주로 컨트롤러(Controller)와 DAO 사이에서 중간 역할을 하며, 비즈니스 로직을 담당하는 레이어
    • 비즈니스 로직을 처리하고 결과를 컨트롤러에 반환

요약하면, BoardDao는 데이터베이스와 직접적으로 상호작용하며 데이터 액세스 레이어를 나타내고, BoardService는 비즈니스 로직을 처리하고 이를 컨트롤러에 제공하는 서비스 레이어. 이를 통해 코드의 모듈화와 유지보수성을 향상시킬 수 있으며, 역할과 책임을 분리하여 프로젝트를 더 잘 구성할 수 있습니다.

'spring, springboot' 카테고리의 다른 글

jpa  (0) 2023.09.14
게시판이 여러 이미지를 가지고 있을 때,JPA  (0) 2023.09.13
springBoot file  (0) 2023.09.05
스프링 부트 api  (0) 2023.09.04
Model  (0) 2023.08.24

+ Recent posts