wiki:it:ai:services:cursor
๋ชฉ์ฐจ
๐ป Cursor AI ๊ฐ๋ฐ ๋๊ตฌ ์์ ๊ฐ์ด๋
Cursor๋ AI ๊ธฐ๋ฐ ์ฝ๋ฉ ์ด์์คํดํธ๋ก, ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ํ์ ์ ์ผ๋ก ํฅ์์ํค๋ ๋๊ตฌ์ ๋๋ค. VS Code ๊ธฐ๋ฐ์ ๊ฐ๋ ฅํ AI ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๐ Cursor ์ฃผ์ ํน์ง ๋น๊ต
| ๊ธฐ๋ฅ | Cursor | VS Code | GitHub Copilot |
|---|---|---|---|
| AI ์ฝ๋ ์์ฑ | โญโญโญโญโญ | โญโญ | โญโญโญโญ |
| ์ค์๊ฐ ๋๋ฒ๊น | โญโญโญโญโญ | โญโญโญ | โญโญโญ |
| ์ฝ๋ ๋ฆฌํฉํ ๋ง | โญโญโญโญโญ | โญโญ | โญโญโญโญ |
| ๋ฌธ์ํ | โญโญโญโญ | โญโญโญ | โญโญโญ |
| ๋ฉํฐ ์ธ์ด ์ง์ | โญโญโญโญโญ | โญโญโญโญ | โญโญโญโญ |
| ์ปจํ ์คํธ ์ดํด | โญโญโญโญโญ | โญโญ | โญโญโญ |
๐ฏ ๋ชจ๋ธ๋ณ ์ฑ๋ฅ ๋น๊ต
| ํ๊ฐ ํญ๋ชฉ | GPT-4o | Claude 3.5 | Gemini 2.0 |
|---|---|---|---|
| ์ฝ๋ ์์ฑ ํ์ง | โญโญโญโญโญ | โญโญโญโญ | โญโญโญโญ |
| ๋๋ฒ๊น ๋ฅ๋ ฅ | โญโญโญโญโญ | โญโญโญโญโญ | โญโญโญโญ |
| ์๋ต ์๋ | โญโญโญโญ | โญโญโญโญ | โญโญโญโญโญ |
| ์ปจํ ์คํธ ์ดํด | โญโญโญโญโญ | โญโญโญโญโญ | โญโญโญโญ |
| ๋น์ฉ ํจ์จ์ฑ | โญโญโญ | โญโญโญโญ | โญโญโญโญโญ |
๐ง ํต์ฌ ๊ธฐ๋ฅ
AI ์ฝ๋ ์์ฑ
์ค์๊ฐ ์ฝ๋ ์์ฑ
- ์์ฐ์ด ์ค๋ช ์ผ๋ก ์ฝ๋ ์๋ ์์ฑ
- ํ๋ก์ ํธ ์ปจํ ์คํธ๋ฅผ ๊ณ ๋ คํ ์ค๋งํธ ์ ์
- ํจ์, ํด๋์ค, ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
- ์ฃผ์๊ณผ ๋ฌธ์ํ ์๋ ํฌํจ
์ค์ ์ฌ์ฉ ์์:
ํ๋กฌํํธ: "์ฌ์ฉ์ ์ธ์ฆ์ ์ํ React ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ค"
Cursor ์๋ต:
```jsx
import React, { useState } from 'react';
import './AuthForm.css';
const AuthForm = ({ onLogin }) => {
const [formData, setFormData] = useState({
email: '',
password: ''
});
const [isLoading, setIsLoading] = useState(false);
const handleSubmit = async (e) => {
e.preventDefault();
setIsLoading(true);
try {
const response = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(formData)
});
if (response.ok) {
const userData = await response.json();
onLogin(userData);
}
} catch (error) {
console.error('Login failed:', error);
} finally {
setIsLoading(false);
}
};
return (
<form onSubmit={handleSubmit} className="auth-form">
<input
type="email"
placeholder="์ด๋ฉ์ผ"
value={formData.email}
onChange={(e) => setFormData({...formData, email: e.target.value})}
required
/>
<input
type="password"
placeholder="๋น๋ฐ๋ฒํธ"
value={formData.password}
onChange={(e) => setFormData({...formData, password: e.target.value})}
required
/>
<button type="submit" disabled={isLoading}>
{isLoading ? '๋ก๊ทธ์ธ ์ค...' : '๋ก๊ทธ์ธ'}
</button>
</form>
);
};
export default AuthForm;
```
AI ๋๋ฒ๊น
์ค๋งํธ ์ค๋ฅ ๋ถ์
- ์ค๋ฅ ๋ฉ์์ง ์๋ ๋ถ์ ๋ฐ ํด๊ฒฐ์ฑ ์ ์
- ์ฝ๋ ์คํ ํ๋ฆ ์ถ์
- ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ์๋ณ
- ๋ณด์ ์ทจ์ฝ์ ๊ฒํ
๋๋ฒ๊น ์์:
์ค๋ฅ: "TypeError: Cannot read property 'name' of undefined" Cursor ๋ถ์: ์ด ์ค๋ฅ๋ user ๊ฐ์ฒด๊ฐ undefined์ผ ๋ ๋ฐ์ํฉ๋๋ค. ํด๊ฒฐ์ฑ : ์ต์ ๋ ์ฒด์ด๋ ๋๋ ๊ธฐ๋ณธ๊ฐ ์ค์ ์์ ๋ ์ฝ๋: ```javascript // ๊ธฐ์กด ์ฝ๋ const userName = user.name; // ์์ ๋ ์ฝ๋ const userName = user?.name || 'Unknown User'; ```
AI ์ฝ๋ ๋ฆฌํฉํ ๋ง
์๋ ์ฝ๋ ๊ฐ์
- ์ฝ๋ ํ์ง ์๋ ๋ถ์
- ์ฑ๋ฅ ์ต์ ํ ์ ์
- ๊ฐ๋ ์ฑ ํฅ์
- ์ํคํ ์ฒ ๊ฐ์
๋ฆฌํฉํ ๋ง ์์:
๊ธฐ์กด ์ฝ๋:
```javascript
function processData(data) {
let result = [];
for (let i = 0; i < data.length; i++) {
if (data[i].active) {
result.push(data[i].name);
}
}
return result;
}
```
Cursor ๋ฆฌํฉํ ๋ง:
```javascript
function processData(data) {
return data
.filter(item => item.active)
.map(item => item.name);
}
```
๐ฐ ๊ฐ๊ฒฉ ์ ์ฑ
| ํ๋ | ๊ฐ๊ฒฉ | ์ฃผ์ ๊ธฐ๋ฅ |
|---|---|---|
| Free | $0 | ๊ธฐ๋ณธ AI ๊ธฐ๋ฅ, ์ ํ๋ ์ฌ์ฉ๋ |
| Pro | $20/์ | ๋ฌด์ ํ ์ฌ์ฉ, ๊ณ ๊ธ ๊ธฐ๋ฅ |
| Team | $25/์/์ฌ์ฉ์ | ํ ํ์ , ๊ณต์ ์ค์ |
| Enterprise | ๋ง์ถคํ | ๊ธฐ์ ์ ์ฉ, ๋ณด์ ๊ฐํ |
๐ ํ์ฉ ์๋๋ฆฌ์ค
| ๊ฐ๋ฐ ์์ญ | Cursor ํ์ฉ | ๊ธฐ๋ ํจ๊ณผ |
|---|---|---|
| ์น ๊ฐ๋ฐ | React/Vue ์ปดํฌ๋ํธ ์๋ ์์ฑ | ๊ฐ๋ฐ ์๋ 3๋ฐฐ ํฅ์ |
| ๋ฐฑ์๋ ๊ฐ๋ฐ | API ์๋ํฌ์ธํธ ์๋ ์์ฑ | ์๋ฒ ๊ฐ๋ฐ ์๊ฐ ๋จ์ถ |
| ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ | React Native/Flutter ์ฝ๋ | ํฌ๋ก์ค ํ๋ซํผ ๊ฐ๋ฐ |
| ๋ฐ์ดํฐ ๊ณผํ | Python ๋ถ์ ์คํฌ๋ฆฝํธ | ๋ฐ์ดํฐ ๋ถ์ ์๋ํ |
๐ง ์ค์ ๋ฐ ์ต์ ํ
| ์ค์ ์์ญ | ์ต์ ํ ๋ฐฉ๋ฒ |
|---|---|
| ํ๋ก์ ํธ ์ค์ | .cursorrules ํ์ผ๋ก ์ฝ๋ฉ ์คํ์ผ ์ ์ |
| ํ๋กฌํํธ ์ต์ ํ | ๊ตฌ์ฒด์ ์ด๊ณ ๋ช ํํ ์๊ตฌ์ฌํญ ์์ฑ |
| ๋ชจ๋ธ ์ ํ | ํ๋ก์ ํธ ํน์ฑ์ ๋ง๋ AI ๋ชจ๋ธ ์ ํ |
| ํ ํ์ | ๊ณตํต ์ค์ ๋ฐ ์ฝ๋ ๋ฆฌ๋ทฐ ์ํฌํ๋ก์ฐ |
๐ ๋ณด์ ๋ฐ ๊ฐ์ธ์ ๋ณด
| ๋ณด์ ์์ญ | Cursor ์ ์ฑ |
|---|---|
| ๋ฐ์ดํฐ ์ํธํ | ์๋ํฌ์๋ ์ํธํ๋ก ์ฝ๋ ๋ณดํธ |
| ๊ฐ์ธ์ ๋ณด ๋ณดํธ | ์ฌ์ฉ์ ๋ฐ์ดํฐ ์ต์ํ ๋ฐ ์๋ ์ญ์ |
| ์ ๊ทผ ์ ์ด | ์ญํ ๊ธฐ๋ฐ ๊ถํ ๊ด๋ฆฌ ์์คํ |
| ๊ฐ์ฌ ๋ก๊ทธ | ๋ชจ๋ ํ๋ ๊ธฐ๋ก ๋ฐ ์ถ์ |
๐ฎ ํฅํ ์ ๋ง
| ๋ฐ์ ๋ฐฉํฅ | Cursor 2.0 | ์ ๊ณ ์ํฅ |
|---|---|---|
| AI ๋ชจ๋ธ | ๋ ์ ํํ ์ฝ๋ ์์ฑ | ๊ฐ๋ฐ์ ์์ฐ์ฑ ํ์ |
| ํ์ ๊ธฐ๋ฅ | ์ค์๊ฐ ํ์ | ํ ๊ฐ๋ฐ ํจ์จ์ฑ ์ฆ๋ |
| ๋ฉํฐ๋ชจ๋ฌ | ์ด๋ฏธ์ง/์์ฑ ๊ธฐ๋ฐ ์ฝ๋ฉ | ์๋ก์ด ๊ฐ๋ฐ ํจ๋ฌ๋ค์ |
| ๊ฐ์ธํ | ์ฌ์ฉ์ ๋ง์ถค AI | ๊ฐ์ธํ๋ ๊ฐ๋ฐ ๊ฒฝํ |
๐ ๊ด๋ จ ๋งํฌ
wiki/it/ai/services/cursor.txt ยท ๋ง์ง๋ง์ผ๋ก ์์ ๋จ: ์ ์ 127.0.0.1
